ページ 11

キャニー法について

Posted: 2015年7月15日(水) 10:29
by ぱちお
このプログラムが実行しようとするとエラー吐くんですけどなぜなのかアドバイスいただけませんか

コード:

#define Th_sabun 15                            //背景差分の閾値
#define Th_UGOKI 64*2



#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h>
#include "misc.h"
#include "pgm.h"
#include "gm.h"
#include "ppm.h"
#include "ii.h"
int sabun_r[720][480];
int sabun_g[720][480];
int sabun_b[720][480];


int saishuu_doutai[720][480];

unsigned char gaso_f[720 * 480];//いじくった
unsigned char gaso_b[720 * 480];//いじくった
int gaso_f_ptr;
int gaso_b_ptr;

double r00, g00, b00, r10, g10, b10, r20, g20, b20, r01;
double g01, b01, r11, g11, b11, r21, g21, b21, r02, g02;
double b02, r12, g12, b12, r22, g22, b22;
double r30, g30, b30, r40, g40, b40, r31, g31, b31;
double r41, g41, b41, r32, g32, b32, r42, g42, b42;
double r03, g03, b03, r13, g13, b13, r23, g23, b23;
double r33, g33, b33, r43, g43, b43, r04, g04, b04;
double r14, g14, b14, r24, g24, b24, r34, g34, b34, r44, g44, b44;



double psnr(Ppm *ppm1, Ppm *ppm2);
double heikin(unsigned char *val, int gasoptr);

#define maxb(x)     ((x>255) ? 255:x)
#define maxmin(x)  ((x<0) ? 0 : max(x))
#define min0(x)     ((x>0) ? x:0)
#define N 10
inline double saturate(double x){ return ((x>0.0)?(x<1.0)?x:1.0:0.0); }
inline double saturate2(double x){ return ((x>0.0)?(x<255.0)?x:255.0:0.0); }


//100902 グローバル変数。出力する画像の画素値を、保存しておく変数
//unsigned char *colorr;
unsigned char colorg[720][480];
//unsigned char *colorb;
Pixel *p;
Pixel *p2;
Pixel *p3;

//100902 動きのあるブロックか否かを保持する変数。
int kouho[720/8][480/8];


// 拡大倍率。この実験では1.0を入れておいて下さい。
//#define RatioH 1.0
//#define RatioW 1.0

//int saishuu_doutai[720][480];

//unsigned char gaso_f[720*480];//いじくった
//unsigned char gaso_b[720*480];//いじくった
//int gaso_f_ptr;
//int gaso_b_ptr;

	


int main(int argc, char *argv[])
{
 

	Pgm *pgmIn, *pgmOut;
	Ppm *ppmIn1, *ppmIn2, *ppmOut;

	int newWidth, newHeight;

	int u,v;
	int x,y;
	int x1,x2,y1,y2;
	int goukei_r, goukei_g, goukei_b;
	int goukei_g_min;
	int u_min;
	int v_min;

	IiPpmNb *nb1;
	IiPpmNb *nb2;

	int i,j,k,l;



	double suuji;


	int kido1, kido2;
	int sabun;

	int kouho_tmp;
	int kouho_ryouiki;


	int check;						//人がいるっぽいと認識した数

    DWORD dwTime_prev, dwTime;


	if(argc < 3){
		printf("iitest gazou ggazou\n");
		return -1;
	}


	// PPMファイルの読み込み		ppmInというポインタ変数に、入力した画像の画素値が入力される。
	ppmIn1=ppmRead(argv[1]);
//	ppmIn2=ppmRead(argv[2]);

	// ppmInの書式:
	 newWidth=ppmIn1->width;		//画像の幅
	 newHeight=ppmIn1->height;	    //画像の高さ



	nb1=iiPpmNbCreate(1, 1);
//	nb2=iiPpmNbCreate(1, 1);

//	printf("背景差分の閾値を %d にセットしました。\n", Th_sabun);

//	suuji = psnr(ppmIn1, ppmIn2);
//    printf("%f \n", suuji);



    //100902 画像を書き込む準備をする。
    ppmOut = ppmCreate(newWidth, newHeight, PpmMaxPixel);
    p = (Pixel *)calloc(sizeof(Pixel), newWidth*newHeight);


//puts("1");	
	
	//100902 背景差分の処理をする部分を作る。
    //

	dwTime_prev = GetTickCount();

	gaso_f_ptr =0;																					//131212追加
	gaso_b_ptr =0;																					//131212追加

	//
	//
	//ここに、新処理を加える。
	//
	//
	for(i=1; i<ppmIn1->height-1; i++){
		for(j=1; j<ppmIn1->width-1; j++){
			
			//3色変数
			//double r00, g00, b00, r10, g10, b10 ,r20 , g20, b20, r01;
			//double g01, b01, r11, g11, b11, r21, g21, b21, r02, g02;
			//double b02, r12, g12, b12, r22, g22, b22;
			//double r30, g30, b30, r40, g40, b40, r31, g31, b31;
			//double r41, g41, b41, r32, g32, b32, r42, g42, b42;
			//double r03, g03, b03, r13, g13, b13, r23, g23, b23;
			//double r33, g33, b33, r43, g43, b43, r04, g04, b04;
			//double r14, g14, b14, r24, g24, b24, r34, g34, b34, r44, g44, b44;
			
			//平均値変数
			double average_r, average_b, average_g;

			//ファイル①
			// 元の画像の画素を取り出している								そのまま  +1 +1
			iiPpmNbPlace(nb1, ppmIn1, j+0, i+0);					//座標 (-1,-1) → (0,0)
			r00 = nb1->p[0][0].r;									//赤				z10 → r00;				//左上赤
			g00 = nb1->p[0][0].b;									//青				z11 → b00;				//左上青
			b00 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+1, i+0);						//座標 (0,-1)  → (1,0)
			r10 = nb1->p[0][0].r;									//赤
			g10 = nb1->p[0][0].b;									//青
			b10 = nb1->p[0][0].g;									//緑				z15 → g10;             //上緑
			iiPpmNbPlace(nb1, ppmIn1, j+2, i+0);					//座標 (+1,-1)  → (2,0)
			r20 = nb1->p[0][0].r;									//赤
			g20 = nb1->p[0][0].b;									//青
			b20 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+0, i+1);						//座標 (-1, 0)  → (0,1)
			r01 = nb1->p[0][0].r;									//赤
			g01 = nb1->p[0][0].b;									//青
			b01 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+1, i+1);						//座標
			r11 = nb1->p[0][0].r;									//赤
			g11 = nb1->p[0][0].b;									//青
			b11 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+2, i+1);						//座標
			r21 = nb1->p[0][0].r;									//赤
			g21 = nb1->p[0][0].b;									//青
			b21 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+0, i+2);					//座標
			r02 = nb1->p[0][0].r;									//赤
			g02 = nb1->p[0][0].b;									//青
			b02= nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+1, i+2);						//座標
			r12 = nb1->p[0][0].r;									//赤
			g12 = nb1->p[0][0].b;									//青
			b12 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+2, i+2);					//座標
			r22 = nb1->p[0][0].r;									//赤
			g22 = nb1->p[0][0].b;									//青
			b22 = nb1->p[0][0].g;									//緑
			//ここから追加
			iiPpmNbPlace(nb1, ppmIn1, j + 0, i + 3);					//座標
			r03 = nb1->p[0][0].r;									//赤
			g03 = nb1->p[0][0].b;									//青
			b03 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 0, i + 4);					//座標
			r04 = nb1->p[0][0].r;									//赤
			g04 = nb1->p[0][0].b;									//青
			b04 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 1, i + 3);					//座標
			r13 = nb1->p[0][0].r;									//赤
			g13 = nb1->p[0][0].b;									//青
			b13 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 1, i + 4);					//座標
			r14 = nb1->p[0][0].r;									//赤
			g14 = nb1->p[0][0].b;									//青
			b14 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 2, i + 3);					//座標
			r23 = nb1->p[0][0].r;									//赤
			g23 = nb1->p[0][0].b;									//青
			b23 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 2, i + 4);					//座標
			r24 = nb1->p[0][0].r;									//赤
			g24 = nb1->p[0][0].b;									//青
			b24 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 3, i + 0);					//座標
			r30 = nb1->p[0][0].r;									//赤
			g30 = nb1->p[0][0].b;									//青
			b30 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 3, i + 1);					//座標
			r31 = nb1->p[0][0].r;									//赤
			g31 = nb1->p[0][0].b;									//青
			b31 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 3, i + 2);					//座標
			r32 = nb1->p[0][0].r;									//赤
			g32 = nb1->p[0][0].b;									//青
			b32 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 3, i + 3);					//座標
			r33 = nb1->p[0][0].r;									//赤
			g33 = nb1->p[0][0].b;									//青
			b33 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 3, i + 4);					//座標
			r34 = nb1->p[0][0].r;									//赤
			g34 = nb1->p[0][0].b;									//青
			b34 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 4, i + 0);					//座標
			r40 = nb1->p[0][0].r;									//赤
			g40 = nb1->p[0][0].b;									//青
			b40 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 4, i + 1);					//座標
			r41 = nb1->p[0][0].r;									//赤
			g41 = nb1->p[0][0].b;									//青
			b41 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 4, i + 2);					//座標
			r42 = nb1->p[0][0].r;									//赤
			g42 = nb1->p[0][0].b;									//青
			b42 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 4, i + 3);					//座標
			r43 = nb1->p[0][0].r;									//赤
			g43 = nb1->p[0][0].b;									//青
			b43 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j + 4, i + 4);					//座標
			r44 = nb1->p[0][0].r;									//赤
			g44 = nb1->p[0][0].b;									//青
			b44 = nb1->p[0][0].g;									//緑



						
			//新画素平均  左上    上  右上   		左  	自分   	右    左下       下  右下
			double filterX[5][5] = {
				{-1.0,-2,0,2,1},
				{-4,-8,0,8,4},
				{-6,-12,0,12,6},
				{-4,-8,0,8,4},
				{-1,-2,0,2,1}
			};
			
			double mult = 0.8;
			double Lx;// = ((filterX[0][0]*z10) +(filterX[0][1]*z13) + (filterX[0][2]*z16) +(filterX[1][0]*z19) + (filterX[1][1]*z22) +(filterX[1][2]*z25) + (filterX[2][0]*z28) +(filterX[2][1]*z31) + (filterX[2][2]*z34)) *mult; ///// x成分
			//double Ly;
		    //赤
			Lx = ((filterX[0][0] * r00) + (filterX[0][1] * r10) + (filterX[0][2] * r20) + (filterX[1][0] * r01) + (filterX[1][1] * r11) + (filterX[1][2] * r21) + (filterX[2][0] * r02) + (filterX[2][1] * r12) + (filterX[2][2] * r22) + (filterX[0][3] * r03) + (filterX[0][4] * r04) + (filterX[1][3] * r13) + (filterX[1][4] * r14) + (filterX[2][3] * r23) + (filterX[2][4] * r24) + (filterX[3][0] * r30) + (filterX[3][1] * r31) + (filterX[3][2] * r32) + (filterX[3][3] * r33) + (filterX[3][4] * r34) + (filterX[4][0] * r40) + (filterX[4][1] * r41) + (filterX[4][2] * r42) + (filterX[4][3] * r43) + (filterX[4][4] * r44)) * mult;
			average_r = Lx;//saturate2(Ld*thetaR);			///// r成分

			//緑
			Lx = ((filterX[0][0] * g00) + (filterX[0][1] * g10) + (filterX[0][2] * g20) + (filterX[1][0] * g01) + (filterX[1][1] * g11) + (filterX[1][2] * g21) + (filterX[2][0] * g02) + (filterX[2][1] * g12) + (filterX[2][2] * g22) + (filterX[0][3] * g03) + (filterX[0][4] * g04) + (filterX[1][3] * g13) + (filterX[1][4] * g14) + (filterX[2][3] * g23) + (filterX[2][4] * g24) + (filterX[3][0] * g30) + (filterX[3][1] * g31) + (filterX[3][2] * g32) + (filterX[3][3] * g33) + (filterX[3][4] * g34) + (filterX[4][0] * g40) + (filterX[4][1] * g41) + (filterX[4][2] * g42) + (filterX[4][3] * g43) + (filterX[4][4] * g44)) * mult;
			average_g = Lx;//saturate2(Ld*thetaG);			///// g成分

			//青
			Lx = ((filterX[0][0] * b00) + (filterX[0][1] * b10) + (filterX[0][2] * b20) + (filterX[1][0] * b01) + (filterX[1][1] * b11) + (filterX[1][2] * b21) + (filterX[2][0] * b02) + (filterX[2][1] * b12) + (filterX[2][2] * b22) + (filterX[0][3] * b03) + (filterX[0][4] * b04) + (filterX[1][3] * b13) + (filterX[1][4] * b14) + (filterX[2][3] * b23) + (filterX[2][4] * b24) + (filterX[3][0] * b30) + (filterX[3][1] * b31) + (filterX[3][2] * b32) + (filterX[3][3] * b33) + (filterX[3][4] * b34) + (filterX[4][0] * b40) + (filterX[4][1] * b41) + (filterX[4][2] * b42) + (filterX[4][3] * b43) + (filterX[4][4] * b44)) * mult;
			average_b = Lx;//saturate2(Ld*thetaB);			///// b成分
	
			//sobel
			//double filterY[3][3] = {
				//{ -1, 0, 1 },
				//{ -2, 0, 2 },
				//{ -1, 0, 1 }
			//};

			//double multY = 0.8;
			////赤
			//Ly = ((filterY[0][0] * r00) + (filterY[0][1] * r10) + (filterY[0][2] * r20) + (filterY[1][0] * r01) + (filterY[1][1] * r11) + (filterY[1][2] * r21) + (filterY[2][0] * r02) + (filterY[2][1] * r12) + (filterY[2][2] * r22)) / multY;
			//average_r = Lx * Ly;//saturate2(Ld*thetaR);			///// r成分

			//緑
			//Lx = ((filterY[0][0] * g00) + (filterY[0][1] * g10) + (filterY[0][2] * g20) + (filterY[1][0] * g01) + (filterY[1][1] * g11) + (filterY[1][2] * g21) + (filterY[2][0] * g02) + (filterY[2][1] * g12) + (filterY[2][2] * g22)) / multY;
			//average_b = Lx * Ly;//saturate2(Ld*thetaG);			///// g成分

			//青
			//Lx = ((filterY[0][0] * b00) + (filterY[0][1] * b10) + (filterY[0][2] * b20) + (filterY[1][0] * b01) + (filterY[1][1] * b11) + (filterY[1][2] * b21) + (filterY[2][0] * b02) + (filterY[2][1] * b12) + (filterY[2][2] * b22)) / multY;
			//average_g = Lx * Ly;//saturate2(Ld*thetaB);			///// b成分


			p->r = (unsigned char)(average_r);			//r成分の画素値を書き込む
			p->b = (unsigned char)(average_b);			//b成分の画素値を書き込む
			p->g = (unsigned char)(average_g);			//g成分の画素値を書き込む

			PpmPixel(ppmOut, i, j) = *p++;

		}
	}

	ppmWrite(argv[2], ppmOut);

 printf("done.\n");

}





double psnr(Ppm *ppm1, Ppm *ppm2){
	int i,j;
	IiPpmNb *nb1;
	IiPpmNb *nb2;
	double psnr_r, psnr_g, psnr_b;
	double add_r, add_g, add_b;
	double psnrout;


	nb1=iiPpmNbCreate(1, 1);
	nb2=iiPpmNbCreate(1, 1);

	add_r = 0.0;
	add_g = 0.0;
	add_b = 0.0;

	for (i=0; i<ppm1->height; i++)
		for (j=0; j<ppm1->width-1; j++){

			iiPpmNbPlace(nb1, ppm1, j, i);
			iiPpmNbPlace(nb2, ppm2, j, i);
			add_r += (double)((nb1->p[0][0].r - nb2->p[0][0].r)*(nb1->p[0][0].r - nb2->p[0][0].r));
			add_g += (double)((nb1->p[0][0].g - nb2->p[0][0].g)*(nb1->p[0][0].g - nb2->p[0][0].g));
			add_b += (double)((nb1->p[0][0].b - nb2->p[0][0].b)*(nb1->p[0][0].b - nb2->p[0][0].b));
		}

	add_r /= (ppm1->height*ppm1->width);
	add_g /= (ppm1->height*ppm1->width);
	add_b /= (ppm1->height*ppm1->width);
	psnr_r = 10.0 * log(65536.0/add_r);
	psnr_g = 10.0 * log(65536.0/add_g);
	psnr_b = 10.0 * log(65536.0/add_b);

	printf("R:%f G:%f B:%f \n", psnr_r, psnr_g, psnr_b);

	psnrout=(psnr_r + psnr_g + psnr_b)/3.0;

	return psnrout;
}

Re: キャニー法について

Posted: 2015年7月15日(水) 21:46
by みけCAT
ぱちお さんが書きました:このプログラムが実行しようとするとエラー吐くんですけどなぜなのかアドバイスいただけませんか
とりあえずコンパイルが通るようにしてみましたが、エラーは出ませんでした。
具体的にどのようなエラーが吐かれるのでしょうか?

misc.h

コード:

struct Ppm {
	int width;
	int height;
};

struct Pgm {
};

struct Pixel {
	unsigned char r;
	unsigned char g;
	unsigned char b;
};

struct IiPpmNb {
	Pixel p[100][100];
};

Ppm* ppmRead(const char *a) {
	static Ppm dummy = {1, 1};
	(void)a;
	return &dummy;
}

IiPpmNb* iiPpmNbCreate(int a, int b) {
	static IiPpmNb dummy = {0, 0, 0};
	(void)a;
	(void)b;
	return &dummy;
}

void iiPpmNbPlace(const IiPpmNb *a, const  Ppm *b, int c, int d) {
	(void)a;
	(void)b;
	(void)c;
	(void)d;
}

void ppmWrite(const char *a, Ppm *b) {
	(void)a;
	(void)b;
}

const int PpmMaxPixel = 1;

Ppm *ppmCreate(int a, int b, int c) {
	static Ppm dummy = {1, 1};
	(void)a;
	(void)b;
	(void)c;
	return &dummy;
}

Pixel &PpmPixel(const Ppm *a, int b, int c) {
	static Pixel dummy;
	(void)a;
	(void)b;
	(void)c;
	return dummy;
}
gm.h、ii.h、pgm.h、ppm.hは空ファイル。

Re: キャニー法について

Posted: 2015年7月15日(水) 22:56
by ぱちお
コンパイルは通るんですけどこのフィルタのプログラムを画像に実行しようとするとと強制終了してしまうんです。
もともと3*3のガウシアンフィルタのプログラムだったものを改造したのですがわからなくなってしまって・・・

Re: キャニー法について

Posted: 2015年7月15日(水) 23:27
by みけCAT
ぱちお さんが書きました:コンパイルは通るんですけどこのフィルタのプログラムを画像に実行しようとするとと強制終了してしまうんです。
デバッガ(gdbなど)で、どこで落ちているか調べられますか?
例えばj=ppmIn1->width-2のときiiPpmNbPlace(nb1, ppmIn1, j + 4, i + 4);は範囲外になりそうですが、
iiPpmNbPlaceはちゃんと範囲外の値を渡しても大丈夫な仕様になっていますか?
オフトピック
この画素を取り出す部分、素直にfor文で配列に格納するのではダメだったのだろうか…?

Re: キャニー法について

Posted: 2015年7月15日(水) 23:50
by ぱちお
デバッガの使い方がわかりません・・・勉強不足で申し訳ないです
たぶん範囲外の値を渡せなくなっているのですがどうすれば渡せるようになるのか・・・

Re: キャニー法について

Posted: 2015年7月15日(水) 23:52
by みけCAT
ぱちお さんが書きました:たぶん範囲外の値を渡せなくなっているのですがどうすれば渡せるようになるのか・・・
本当に範囲外の値を渡す必要があるのですか?
main関数側で対策できませんか?

Re: キャニー法について

Posted: 2015年7月16日(木) 00:00
by ぱちお
すみませんどういじればよいか・・・

一応いじる前のソース載せときます

コード:

#define Th_sabun 15                            //背景差分の閾値
#define Th_UGOKI 64*2



#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h>
#include "misc.h"
#include "pgm.h"
#include "gm.h"
#include "ppm.h"
#include "ii.h"
int sabun_r[720][480];
int sabun_g[720][480];
int sabun_b[720][480];


double psnr(Ppm *ppm1, Ppm *ppm2);
double heikin(unsigned char *val, int gasoptr);

#define maxb(x)     ((x>255) ? 255:x)
#define maxmin(x)  ((x<0) ? 0 : max(x))
#define min0(x)     ((x>0) ? x:0)
#define N 10
inline double saturate(double x){ return ((x>0.0)?(x<1.0)?x:1.0:0.0); }
inline double saturate2(double x){ return ((x>0.0)?(x<255.0)?x:255.0:0.0); }


//100902 グローバル変数。出力する画像の画素値を、保存しておく変数
//unsigned char *colorr;
unsigned char colorg[720][480];
//unsigned char *colorb;
Pixel *p;
Pixel *p2;
Pixel *p3;

//100902 動きのあるブロックか否かを保持する変数。
int kouho[720/8][480/8];


// 拡大倍率。この実験では1.0を入れておいて下さい。
//#define RatioH 1.0
//#define RatioW 1.0

int saishuu_doutai[720][480];

unsigned char gaso_f[720*480];//いじくった
unsigned char gaso_b[720*480];//いじくった
int gaso_f_ptr;
int gaso_b_ptr;

	


int main(int argc, char *argv[])
{
 

	Pgm *pgmIn, *pgmOut;
	Ppm *ppmIn1, *ppmIn2, *ppmOut;

	int newWidth, newHeight;

	int u,v;
	int x,y;
	int x1,x2,y1,y2;
	int goukei_r, goukei_g, goukei_b;
	int goukei_g_min;
	int u_min;
	int v_min;

	IiPpmNb *nb1;
	IiPpmNb *nb2;

	int i,j,k,l;



	double suuji;


	int kido1, kido2;
	int sabun;

	int kouho_tmp;
	int kouho_ryouiki;


	int check;						//人がいるっぽいと認識した数

    DWORD dwTime_prev, dwTime;


	if(argc < 3){
		printf("iitest gazou ggazou\n");
		return -1;
	}


	// PPMファイルの読み込み		ppmInというポインタ変数に、入力した画像の画素値が入力される。
	ppmIn1=ppmRead(argv[1]);
//	ppmIn2=ppmRead(argv[2]);

	// ppmInの書式:
	 newWidth=ppmIn1->width;		//画像の幅
	 newHeight=ppmIn1->height;	    //画像の高さ



	nb1=iiPpmNbCreate(1, 1);
//	nb2=iiPpmNbCreate(1, 1);

//	printf("背景差分の閾値を %d にセットしました。\n", Th_sabun);

//	suuji = psnr(ppmIn1, ppmIn2);
//    printf("%f \n", suuji);



    //100902 画像を書き込む準備をする。
    ppmOut = ppmCreate(newWidth, newHeight, PpmMaxPixel);
    p = (Pixel *)calloc(sizeof(Pixel), newWidth*newHeight);


//puts("1");	
	
	//100902 背景差分の処理をする部分を作る。
    //

	dwTime_prev = GetTickCount();

	gaso_f_ptr =0;																					//131212追加
	gaso_b_ptr =0;																					//131212追加

	//
	//
	//ここに、新処理を加える。
	//
	//
	for(i=1; i<ppmIn1->height-1; i++){
		for(j=1; j<ppmIn1->width-1; j++){
			
			//3色変数
			double r00, g00, b00, r10, g10,b10 ,r20 , g20, b20, r01;
			double g01, b01, r11, g11, b11, r21, g21, b21, r02, g02;
			double b02, r12, g12, b12, r22, g22, b22;
			
			//平均値変数
			double average_r, average_b, average_g;

			//ファイル①
			// 元の画像の画素を取り出している								そのまま  +1 +1
			iiPpmNbPlace(nb1, ppmIn1, j+0, i+0);					//座標 (-1,-1) → (0,0)
			r00 = nb1->p[0][0].r;									//赤				z10 → r00;				//左上赤
			g00 = nb1->p[0][0].b;									//青				z11 → b00;				//左上青
			b00= nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+1, i+0);						//座標 (0,-1)  → (1,0)
			r10 = nb1->p[0][0].r;									//赤
			g10 = nb1->p[0][0].b;									//青
			b10 = nb1->p[0][0].g;									//緑				z15 → g10;             //上緑
			iiPpmNbPlace(nb1, ppmIn1, j+2, i+0);					//座標 (+1,-1)  → (2,0)
			r20 = nb1->p[0][0].r;									//赤
			g20 = nb1->p[0][0].b;									//青
			b20 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+0, i+1);						//座標 (-1, 0)  → (0,1)
			r01 = nb1->p[0][0].r;									//赤
			g01 = nb1->p[0][0].b;									//青
			b01 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+1, i+1);						//座標
			r11 = nb1->p[0][0].r;									//赤
			g11 = nb1->p[0][0].b;									//青
			b11 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+2, i+1);						//座標
			r21 = nb1->p[0][0].r;									//赤
			g21 = nb1->p[0][0].b;									//青
			b21 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+0, i+2);					//座標
			r02 = nb1->p[0][0].r;									//赤
			g02 = nb1->p[0][0].b;									//青
			b02= nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+1, i+2);						//座標
			r12 = nb1->p[0][0].r;									//赤
			g12 = nb1->p[0][0].b;									//青
			b12 = nb1->p[0][0].g;									//緑
			iiPpmNbPlace(nb1, ppmIn1, j+2, i+2);					//座標
			r22 = nb1->p[0][0].r;									//赤
			g22 = nb1->p[0][0].b;									//青
			b22 = nb1->p[0][0].g;									//緑
			
						
			//新画素平均  左上    上  右上   		左  	自分   	右    左下       下  右下
			double filterX[3][3] = {
				{1.0,2,1},
				{2,4,2},
				{1,2,1}
			};
			
			double mult = 16.0;
			double Lx;// = ((filterX[0][0]*z10) +(filterX[0][1]*z13) + (filterX[0][2]*z16) +(filterX[1][0]*z19) + (filterX[1][1]*z22) +(filterX[1][2]*z25) + (filterX[2][0]*z28) +(filterX[2][1]*z31) + (filterX[2][2]*z34)) *mult; ///// x成分

		
			Lx = ((filterX[0][0]*r00) +(filterX[0][1]*r10) + (filterX[0][2]*r20) +(filterX[1][0]*r01) + (filterX[1][1]*r11) +(filterX[1][2]*r21) + (filterX[2][0]*r02) +(filterX[2][1]*r12) + (filterX[2][2]*r22)) /mult;
			average_r = Lx;//saturate2(Ld*thetaR);			///// r成分

			//緑
			Lx = ((filterX[0][0]*g00) +(filterX[0][1]*g10) + (filterX[0][2]*g20) +(filterX[1][0]*g01) + (filterX[1][1]*g11) +(filterX[1][2]*g21) + (filterX[2][0]*g02) +(filterX[2][1]*g12) + (filterX[2][2]*g22)) /mult;
			average_b = Lx;//saturate2(Ld*thetaG);			///// g成分

			//青
			Lx = ((filterX[0][0]*b00) +(filterX[0][1]*b10) + (filterX[0][2]*b20) +(filterX[1][0]*b01) + (filterX[1][1]*b11) +(filterX[1][2]*b21) + (filterX[2][0]*b02) +(filterX[2][1]*b12) + (filterX[2][2]*b22)) /mult;
			average_g = Lx;//saturate2(Ld*thetaB);			///// b成分
	

			p->r = (unsigned char)(average_r);			//r成分の画素値を書き込む
			p->b = (unsigned char)(average_b);			//b成分の画素値を書き込む
			p->g = (unsigned char)(average_g);			//g成分の画素値を書き込む

			PpmPixel(ppmOut, i, j) = *p++;

		}
	}

	ppmWrite(argv[2], ppmOut);

 printf("done.\n");

}





double psnr(Ppm *ppm1, Ppm *ppm2){
	int i,j;
	IiPpmNb *nb1;
	IiPpmNb *nb2;
	double psnr_r, psnr_g, psnr_b;
	double add_r, add_g, add_b;
	double psnrout;


	nb1=iiPpmNbCreate(1, 1);
	nb2=iiPpmNbCreate(1, 1);

	add_r = 0.0;
	add_g = 0.0;
	add_b = 0.0;

	for (i=0; i<ppm1->height; i++)
		for (j=0; j<ppm1->width-1; j++){

			iiPpmNbPlace(nb1, ppm1, j, i);
			iiPpmNbPlace(nb2, ppm2, j, i);
			add_r += (double)((nb1->p[0][0].r - nb2->p[0][0].r)*(nb1->p[0][0].r - nb2->p[0][0].r));
			add_g += (double)((nb1->p[0][0].g - nb2->p[0][0].g)*(nb1->p[0][0].g - nb2->p[0][0].g));
			add_b += (double)((nb1->p[0][0].b - nb2->p[0][0].b)*(nb1->p[0][0].b - nb2->p[0][0].b));
		}

	add_r /= (ppm1->height*ppm1->width);
	add_g /= (ppm1->height*ppm1->width);
	add_b /= (ppm1->height*ppm1->width);
	psnr_r = 10.0 * log(65536.0/add_r);
	psnr_g = 10.0 * log(65536.0/add_g);
	psnr_b = 10.0 * log(65536.0/add_b);

	printf("R:%f G:%f B:%f \n", psnr_r, psnr_g, psnr_b);

	psnrout=(psnr_r + psnr_g + psnr_b)/3.0;

	return psnrout;
}

Re: キャニー法について

Posted: 2015年7月16日(木) 00:35
by みけCAT
なるほど、「いじる前のソース」ではjがppmIn1->width-2までにしかならず、足す値も2までだから、
ppmIn1->widthまでしかアクセスせず、おそらく範囲外にならないのですね。
iについても同様です。
ぱちお さんが書きました:すみませんどういじればよいか・・・
例えば、こんな感じでしょうか?(結果の正当性は知りません)

コード:

#define Th_sabun 15                            //背景差分の閾値
#define Th_UGOKI 64*2



#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h>
#include "misc.h"
#include "pgm.h"
#include "gm.h"
#include "ppm.h"
#include "ii.h"
int sabun_r[720][480];
int sabun_g[720][480];
int sabun_b[720][480];


int saishuu_doutai[720][480];

unsigned char gaso_f[720 * 480];//いじくった
unsigned char gaso_b[720 * 480];//いじくった
int gaso_f_ptr;
int gaso_b_ptr;

double r[5][5];
double g[5][5];
double b[5][5];


double psnr(Ppm *ppm1, Ppm *ppm2);
double heikin(unsigned char *val, int gasoptr);

#define maxb(x)     ((x>255) ? 255:x)
#define maxmin(x)  ((x<0) ? 0 : max(x))
#define min0(x)     ((x>0) ? x:0)
#define N 10
inline double saturate(double x){ return ((x>0.0)?(x<1.0)?x:1.0:0.0); }
inline double saturate2(double x){ return ((x>0.0)?(x<255.0)?x:255.0:0.0); }


//100902 グローバル変数。出力する画像の画素値を、保存しておく変数
//unsigned char *colorr;
unsigned char colorg[720][480];
//unsigned char *colorb;
Pixel *p;
Pixel *p2;
Pixel *p3;

//100902 動きのあるブロックか否かを保持する変数。
int kouho[720/8][480/8];


// 拡大倍率。この実験では1.0を入れておいて下さい。
//#define RatioH 1.0
//#define RatioW 1.0

//int saishuu_doutai[720][480];

//unsigned char gaso_f[720*480];//いじくった
//unsigned char gaso_b[720*480];//いじくった
//int gaso_f_ptr;
//int gaso_b_ptr;

	


int main(int argc, char *argv[])
{
 

	Pgm *pgmIn, *pgmOut;
	Ppm *ppmIn1, *ppmIn2, *ppmOut;

	int newWidth, newHeight;

	int u,v;
	int x,y;
	int x1,x2,y1,y2;
	int goukei_r, goukei_g, goukei_b;
	int goukei_g_min;
	int u_min;
	int v_min;

	IiPpmNb *nb1;
	IiPpmNb *nb2;

	int i,j,k,l;



	double suuji;


	int kido1, kido2;
	int sabun;

	int kouho_tmp;
	int kouho_ryouiki;


	int check;						//人がいるっぽいと認識した数

    DWORD dwTime_prev, dwTime;


	if(argc < 3){
		printf("iitest gazou ggazou\n");
		return -1;
	}


	// PPMファイルの読み込み		ppmInというポインタ変数に、入力した画像の画素値が入力される。
	ppmIn1=ppmRead(argv[1]);
//	ppmIn2=ppmRead(argv[2]);

	// ppmInの書式:
	 newWidth=ppmIn1->width;		//画像の幅
	 newHeight=ppmIn1->height;	    //画像の高さ



	nb1=iiPpmNbCreate(1, 1);
//	nb2=iiPpmNbCreate(1, 1);

//	printf("背景差分の閾値を %d にセットしました。\n", Th_sabun);

//	suuji = psnr(ppmIn1, ppmIn2);
//    printf("%f \n", suuji);



    //100902 画像を書き込む準備をする。
    ppmOut = ppmCreate(newWidth, newHeight, PpmMaxPixel);
    p = (Pixel *)calloc(sizeof(Pixel), newWidth*newHeight);


//puts("1");	
	
	//100902 背景差分の処理をする部分を作る。
    //

	dwTime_prev = GetTickCount();

	gaso_f_ptr =0;																					//131212追加
	gaso_b_ptr =0;																					//131212追加

	//
	//
	//ここに、新処理を加える。
	//
	//
	for(i=1; i<ppmIn1->height-1; i++){
		for(j=1; j<ppmIn1->width-1; j++){
			
			//3色変数
			//double r00, g00, b00, r10, g10, b10 ,r20 , g20, b20, r01;
			//double g01, b01, r11, g11, b11, r21, g21, b21, r02, g02;
			//double b02, r12, g12, b12, r22, g22, b22;
			//double r30, g30, b30, r40, g40, b40, r31, g31, b31;
			//double r41, g41, b41, r32, g32, b32, r42, g42, b42;
			//double r03, g03, b03, r13, g13, b13, r23, g23, b23;
			//double r33, g33, b33, r43, g43, b43, r04, g04, b04;
			//double r14, g14, b14, r24, g24, b24, r34, g34, b34, r44, g44, b44;
			
			//平均値変数
			double average_r, average_b, average_g;

			//ファイル①
			// 元の画像の画素を取り出している								そのまま  +1 +1
			int dj, di;
			for (dj = 0; dj < 5; dj++) {
				for (di = 0; di < 5; di++) {
					if (j+dj<=ppmIn1->width && i+di<=ppmIn1->height) {
						iiPpmNbPlace(nb1, ppmIn1, j+dj, i+di);					//座標 (-1,-1) → (0,0)
						r[dj][di] = nb1->p[0][0].r;									//赤				z10 → r00;				//左上赤
						g[dj][di] = nb1->p[0][0].b;									//青				z11 → b00;				//左上青
						b[dj][di] = nb1->p[0][0].g;									//緑
					} else {
						r[dj][di] = 0;
						g[dj][di] = 0;
						b[dj][di] = 0;
					}
				}
			}



						
			//新画素平均  左上    上  右上   		左  	自分   	右    左下       下  右下
			double filterX[5][5] = {
				{-1.0,-2,0,2,1},
				{-4,-8,0,8,4},
				{-6,-12,0,12,6},
				{-4,-8,0,8,4},
				{-1,-2,0,2,1}
			};
			
			double mult = 0.8;
			double Lx;// = ((filterX[0][0]*z10) +(filterX[0][1]*z13) + (filterX[0][2]*z16) +(filterX[1][0]*z19) + (filterX[1][1]*z22) +(filterX[1][2]*z25) + (filterX[2][0]*z28) +(filterX[2][1]*z31) + (filterX[2][2]*z34)) *mult; ///// x成分
			//double Ly;
		    //赤
			Lx = ((filterX[0][0] * r[0][0]) + (filterX[0][1] * r[1][0]) + (filterX[0][2] * r[2][0]) + (filterX[1][0] * r[0][1]) + (filterX[1][1] * r[1][1]) + (filterX[1][2] * r[2][1]) + (filterX[2][0] * r[0][2]) + (filterX[2][1] * r[1][2]) + (filterX[2][2] * r[2][2]) + (filterX[0][3] * r[0][3]) + (filterX[0][4] * r[0][4]) + (filterX[1][3] * r[1][3]) + (filterX[1][4] * r[1][4]) + (filterX[2][3] * r[2][3]) + (filterX[2][4] * r[2][4]) + (filterX[3][0] * r[3][0]) + (filterX[3][1] * r[3][1]) + (filterX[3][2] * r[3][2]) + (filterX[3][3] * r[3][3]) + (filterX[3][4] * r[3][4]) + (filterX[4][0] * r[4][0]) + (filterX[4][1] * r[4][1]) + (filterX[4][2] * r[4][2]) + (filterX[4][3] * r[4][3]) + (filterX[4][4] * r[4][4])) * mult;
			average_r = Lx;//saturate2(Ld*thetaR);			///// r成分

			//緑
			Lx = ((filterX[0][0] * g[0][0]) + (filterX[0][1] * g[1][0]) + (filterX[0][2] * g[2][0]) + (filterX[1][0] * g[0][1]) + (filterX[1][1] * g[1][1]) + (filterX[1][2] * g[2][1]) + (filterX[2][0] * g[0][2]) + (filterX[2][1] * g[1][2]) + (filterX[2][2] * g[2][2]) + (filterX[0][3] * g[0][3]) + (filterX[0][4] * g[0][4]) + (filterX[1][3] * g[1][3]) + (filterX[1][4] * g[1][4]) + (filterX[2][3] * g[2][3]) + (filterX[2][4] * g[2][4]) + (filterX[3][0] * g[3][0]) + (filterX[3][1] * g[3][1]) + (filterX[3][2] * g[3][2]) + (filterX[3][3] * g[3][3]) + (filterX[3][4] * g[3][4]) + (filterX[4][0] * g[4][0]) + (filterX[4][1] * g[4][1]) + (filterX[4][2] * g[4][2]) + (filterX[4][3] * g[4][3]) + (filterX[4][4] * g[4][4])) * mult;
			average_g = Lx;//saturate2(Ld*thetaG);			///// g成分

			//青
			Lx = ((filterX[0][0] * b[0][0]) + (filterX[0][1] * b[1][0]) + (filterX[0][2] * b[2][0]) + (filterX[1][0] * b[0][1]) + (filterX[1][1] * b[1][1]) + (filterX[1][2] * b[2][1]) + (filterX[2][0] * b[0][2]) + (filterX[2][1] * b[1][2]) + (filterX[2][2] * b[2][2]) + (filterX[0][3] * b[0][3]) + (filterX[0][4] * b[0][4]) + (filterX[1][3] * b[1][3]) + (filterX[1][4] * b[1][4]) + (filterX[2][3] * b[2][3]) + (filterX[2][4] * b[2][4]) + (filterX[3][0] * b[3][0]) + (filterX[3][1] * b[3][1]) + (filterX[3][2] * b[3][2]) + (filterX[3][3] * b[3][3]) + (filterX[3][4] * b[3][4]) + (filterX[4][0] * b[4][0]) + (filterX[4][1] * b[4][1]) + (filterX[4][2] * b[4][2]) + (filterX[4][3] * b[4][3]) + (filterX[4][4] * b[4][4])) * mult;
			average_b = Lx;//saturate2(Ld*thetaB);			///// b成分
	
			//sobel
			//double filterY[3][3] = {
				//{ -1, 0, 1 },
				//{ -2, 0, 2 },
				//{ -1, 0, 1 }
			//};

			//double multY = 0.8;
			////赤
			//Ly = ((filterY[0][0] * r[0][0]) + (filterY[0][1] * r[1][0]) + (filterY[0][2] * r[2][0]) + (filterY[1][0] * r[0][1]) + (filterY[1][1] * r[1][1]) + (filterY[1][2] * r[2][1]) + (filterY[2][0] * r[0][2]) + (filterY[2][1] * r[1][2]) + (filterY[2][2] * r[2][2])) / multY;
			//average_r = Lx * Ly;//saturate2(Ld*thetaR);			///// r成分

			//緑
			//Lx = ((filterY[0][0] * g[0][0]) + (filterY[0][1] * g[1][0]) + (filterY[0][2] * g[2][0]) + (filterY[1][0] * g[0][1]) + (filterY[1][1] * g[1][1]) + (filterY[1][2] * g[2][1]) + (filterY[2][0] * g[0][2]) + (filterY[2][1] * g[1][2]) + (filterY[2][2] * g[2][2])) / multY;
			//average_b = Lx * Ly;//saturate2(Ld*thetaG);			///// g成分

			//青
			//Lx = ((filterY[0][0] * b[0][0]) + (filterY[0][1] * b[1][0]) + (filterY[0][2] * b[2][0]) + (filterY[1][0] * b[0][1]) + (filterY[1][1] * b[1][1]) + (filterY[1][2] * b[2][1]) + (filterY[2][0] * b[0][2]) + (filterY[2][1] * b[1][2]) + (filterY[2][2] * b[2][2])) / multY;
			//average_g = Lx * Ly;//saturate2(Ld*thetaB);			///// b成分


			p->r = (unsigned char)(average_r);			//r成分の画素値を書き込む
			p->b = (unsigned char)(average_b);			//b成分の画素値を書き込む
			p->g = (unsigned char)(average_g);			//g成分の画素値を書き込む

			PpmPixel(ppmOut, i, j) = *p++;

		}
	}

	ppmWrite(argv[2], ppmOut);

 printf("done.\n");

}





double psnr(Ppm *ppm1, Ppm *ppm2){
	int i,j;
	IiPpmNb *nb1;
	IiPpmNb *nb2;
	double psnr_r, psnr_g, psnr_b;
	double add_r, add_g, add_b;
	double psnrout;


	nb1=iiPpmNbCreate(1, 1);
	nb2=iiPpmNbCreate(1, 1);

	add_r = 0.0;
	add_g = 0.0;
	add_b = 0.0;

	for (i=0; i<ppm1->height; i++)
		for (j=0; j<ppm1->width-1; j++){

			iiPpmNbPlace(nb1, ppm1, j, i);
			iiPpmNbPlace(nb2, ppm2, j, i);
			add_r += (double)((nb1->p[0][0].r - nb2->p[0][0].r)*(nb1->p[0][0].r - nb2->p[0][0].r));
			add_g += (double)((nb1->p[0][0].g - nb2->p[0][0].g)*(nb1->p[0][0].g - nb2->p[0][0].g));
			add_b += (double)((nb1->p[0][0].b - nb2->p[0][0].b)*(nb1->p[0][0].b - nb2->p[0][0].b));
		}

	add_r /= (ppm1->height*ppm1->width);
	add_g /= (ppm1->height*ppm1->width);
	add_b /= (ppm1->height*ppm1->width);
	psnr_r = 10.0 * log(65536.0/add_r);
	psnr_g = 10.0 * log(65536.0/add_g);
	psnr_b = 10.0 * log(65536.0/add_b);

	printf("R:%f G:%f B:%f \n", psnr_r, psnr_g, psnr_b);

	psnrout=(psnr_r + psnr_g + psnr_b)/3.0;

	return psnrout;
}

Re: キャニー法について

Posted: 2015年7月16日(木) 01:00
by ぱちお
ビルドはできるんですが
cd debug でgausstest.exe¥○○○.ppm¥○○○.ppm
でやるとgausstest.exeは動作を停止しましたとエラーを吐いてしまうんです・・・
質問のしかたが下手で申し訳ないです