初心者なのでまったく分かりませんでした…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
satoshi
記事: 17
登録日時: 8年前

初心者なのでまったく分かりませんでした…

#1

投稿記事 by satoshi » 8年前

コード:


#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "..\imageio.h"

// グローバル変数
unsigned char	dat[720*480*3];			/* 原画像を格納する配列		 */ 
unsigned char	result[720*480*3];		/* 処理画像を格納する配列	 */
double			msk[3][3];				/* フィルタマスクの配列      */
int	cm;					/* Color Mode: cm = 1(モノクロ), 3(カラー)	 */
int	height, width;		/* height: 画像の高さ(y), width: 画像の幅(x) */

// 画素の色成分を扱う構造体
typedef struct pixelColor{
	unsigned char R;
	unsigned char G;
	unsigned char B;
} pColor;

// キャンバスに画素値(色)を描画する関数
void draw_pixel(int x, int y, pColor c){
	glColor3ub(c.R, c.G, c.B);			/* 指定色(pColor c)をセット	 */
		glBegin(GL_POINTS);
		glVertex2d(x, y);				/* セットした色をキャンバス	 */
	glEnd();							/* (x,y)座標に描画	      */
}

// キャンパスに画像を描画するコールバック関数
void display(void){ 
	int	x, y, n;							/* x-y 座標 */
	pColor color;

	glClear(GL_COLOR_BUFFER_BIT);
	for (y=0; y<height; y++){
		/* 原画像の表示(左側)*/
		for (x=0; x<width; x++){
			switch(cm){
			case 1:							/* モノクロ画像の場合	*/
				n = x+width*y;
				color.B = dat[n];			/* (x,y)の輝度値を取得	*/
				color.G = dat[n];
				color.R = dat[n];
				draw_pixel(x, y, color);
				break;
			case 3:							/* カラー画像の場合		*/
				n = (x+width*y)*3;
		 		color.B = dat[n];			/* (x,y)のRGB値を取得	*/
				color.G = dat[n+1];
				color.R = dat[n+2];
				draw_pixel(x, y, color);
				break;
			default:
				printf("不正なカラーモードです.\n");
				exit(1);
			}
		}
		/* 処理画像の表示(右側)*/
		for (x=0; x<width; x++){
			switch(cm){
			case 1:							/* モノクロ画像の場合	*/
				n = x+width*y;
				color.R = result[n];		/* (x,y)の輝度値を取得	*/
				color.G = result[n];
				color.B = result[n];
				draw_pixel(x+width, y, color);
				break;
			case 3:							/* カラー画像の場合		*/
				n = (x+width*y)*3;
		 		color.B = result[n];		/* (x,y)のRGB値を取得	*/
				color.G = result[n+1];
				color.R = result[n+2];
				draw_pixel(x+width, y, color);
				break;
			default:
				printf("不正なカラーモードです.\n");
				exit(1);
			}
		}
 	}
	glFlush();	/* キャンバスを表示 */
}

// ウィンドウサイズ変更時に座標設定を行うコールバック関数
void resize(int w, int h){
	glViewport(0,0,w,h);
	glLoadIdentity();
	gluOrtho2D(0, w, 0, h);
}

// GLUTによる画像表示(左:原画像,右:処理画像)
 void glut_ShowResults(int argc, char** argv){	
	// ウィンドウの初期化
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutInitWindowSize(2*width,height);
	glutInitWindowPosition(100,100);
	glutCreateWindow("image viewer");
	
	// クリアカラー(背景)を黒にセット
	glClearColor(0.0, 0.0, 0.0, 1.0);

	// コールバック関数
	glutDisplayFunc(display);
	glutReshapeFunc(resize);

	//イベント処理ループ
	glutMainLoop();
}

// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no){
	// 
	// 修正箇所② --- ここにコードを追加する
	//
}

// 原画像datをフィルタ処理してresultに格納
void imfilter(int menu_no){
	int x, y, n;

	// フィルタマスクの初期化
	set_msk(menu_no);

	// 画像の各点でフィルタ処理を実行
	for(y=0; y<height; y++){
		for(x=0; x<width; x++){
			if(x>0 && y>0 && x<width-1 && y<height-1){	
				/* 画像の縁でない場合の処理 */
				//
				//  <修正箇所③ --- ここから>
				//  <以下はすべての画素に128を入れるダミーコード>
				//
				if(cm==1){
					n = x+width*y;
					result[n] = 128;
				}
				else{
					n = (x+width*y)*3;
					result[n] = 128;
					result[n+1] = 128;
					result[n+2] = 128;
				}
				//  <修正箇所③ --- ここまで>
			}
			else{
				/* 画像の縁にあたる点の処理 */
				if(cm==1){
					n = x+width*y;
					result[n] = dat[n];
				}
				else{
					n = (x+width*y)*3;
					result[n] = dat[n];
					result[n+1] = dat[n+1];
					result[n+2] = dat[n+2];
				}
			}
		}
	}
}

// フィルタメニューの表示
int filter_menu(void){
	// 
	// 修正箇所① --- ここにコードを追加する
	//
	return 0;
}

// メイン関数
int main(int argc, char** argv){

	// BMP画像の読み込み
	if(argc<2){
		printf("画像ファイルを指定してください.\n");
		exit(1);
	}
	loadbmpfile(argv[1], &cm, &height, &width, dat);
	printf("file name: %s\n", argv[1]);
	printf("color mode = %d\nhight = %d, width = %d\n", cm, height, width);

	// 画像のフィルタ処理
	imfilter(filter_menu());

	// GLUTによる処理画像の表示
	glut_ShowResults(argc, argv);

	return 0;
}

1.filter_menuの部分を 表示されたメニュー以外の番号指定した場合はコンソールで再度Menu番号の入力を促して、9を入力した場合は、処理を行わずプログラムを終了するというプログラムがどんなものかよく分かりません(どんなものかは添付のフィルタ処理プログラムの文字が入ってるもの)
2.Menu番号1が入力されたときガウシアンフィルタによる平滑化を実行して処理画像の右側に表示する(添付してある写真の何も写ってない方に)ガウシアンフィルタのマスク値(図3.3)にセットしてset_maskにコードを追加してガウシアンフィルタによる平滑化の値を計算してresultに格納するようimfilterを修正したプログラムが考えても分かりません
3.Menu番号2が入力されたとき鮮鋭化フィルタによるエッジ強調を実行し処理画像の右側に表示する。図3.6に示す鮮鋭化フィルタのマスク値にセットするようset_maskにコードを追加して画素毎に鮮鋭化フィルタによるエッジ強調出力の値を計算してresultに格納するようimfilterを修正したプログラムが分かりません

先週の金曜から毎日色々なサイトを見て考えているんですけど どうしてもわからなくて 期限が今週の金曜日までで終わらなくて焦ってます…  どなたかプログラムを教えていただけるとありがたいです…

C6b14

Re: 初心者なのでまったく分かりませんでした…

#2

投稿記事 by C6b14 » 8年前

まず こんな 画面 は でてます か?。
http://csi.nisinippon.com/0001.png
( それと #include "..\imageio.h" は 開示 出来る ? )

hide

Re: 初心者なのでまったく分かりませんでした…

#3

投稿記事 by hide » 8年前

本当に一切全くわからないのであれば、
期限の延長や難易度を下げた課題を今すぐお願いしてくるべきです。
初心者にソースコードを渡したところで、どうせ次の課題は解けないので
課題を課した側から見ても誰もいいことはありません。
時間を無駄にしないためにすぐに申し出るべきです。
長期の体調不良などがあったのであれば相談すべきですし、そうでなくても必要です。

そうでないのであればもっと具体的な質問ができるはずです。

satosh

Re: 初心者なのでまったく分かりませんでした…

#4

投稿記事 by satosh » 8年前

C6b14 さんが書きました:まず こんな 画面 は でてます か?。
http://csi.nisinippon.com/0001.png
( それと #include "..\imageio.h" は 開示 出来る ? )
はい! 出てきます! それと開示も出来ます!

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#5

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:まず こんな 画面 は でてます か?。
http://csi.nisinippon.com/0001.png
( それと #include "..\imageio.h" は 開示 出来る ? )
はい! 出てきます!  開示も出来ます!

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#6

投稿記事 by satoshi » 8年前

hide さんが書きました:本当に一切全くわからないのであれば、
期限の延長や難易度を下げた課題を今すぐお願いしてくるべきです。
初心者にソースコードを渡したところで、どうせ次の課題は解けないので
課題を課した側から見ても誰もいいことはありません。
時間を無駄にしないためにすぐに申し出るべきです。
長期の体調不良などがあったのであれば相談すべきですし、そうでなくても必要です。

そうでないのであればもっと具体的な質問ができるはずです。
これは決まった課題なので難易度を下げるとかは難しそうです…

C6b14

Re: 初心者なのでまったく分かりませんでした…

#7

投稿記事 by C6b14 » 8年前

う~ん、そのかわり がんばって ヒント だけで 解けるよう 頑張ってください。
でないと いわれた ことは もっとも なので ”自分のため” ですから。
( .h ファイルを 載せてかださい。)

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#8

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:う~ん、そのかわり がんばって ヒント だけで 解けるよう 頑張ってください。
でないと いわれた ことは もっとも なので ”自分のため” ですから。
( .h ファイルを 載せてかださい。)
分かりました! 頑張ってみます!

コード:

#include <stdio.h>
#include <string.h>

void loadbmpfile(char *loadfile, int *color_mode, 
				 int *height, int *width, unsigned char *dat){
	FILE			*fp;
	char			fname[80];			/* BMPファイル名			*/
	unsigned char	header[54];			/* ヘッダ格納用				*/
	int 			wdth, hght, cm;		/* width, hight, color_mode	*/
	int				pal[1024];			/* カラーパレット格納用		*/
	int				pad, dm;			/* パディングデータ格納用	*/
	int				j, k, l, m;			/* ループ変数				*/

	// BMPファイルのOpen処理
	strcpy(fname, loadfile);
	if(strstr(fname, ".bmp")==NULL)	strcat(fname, ".bmp");
	fp = fopen(fname, "rb");
	if(fp==NULL){
		printf("Can't find file: \"%s\".\n", loadfile);	exit(-1);
	}
	// ヘッダ部の読み込み
	for(j=0; j<54; j++) header[j] = fgetc(fp);
	if(!(header[0]=='B'&& header[1]=='M')){
		printf("\"%s\" is not BMP file.\n", loadfile);  exit(-1);
	}
	// 画像サイズ,カラーモードの取得
	wdth = header[18] + header[19]*256;		/* 画像の幅(width)	*/
	hght = header[22] + header[23]*256;		/* 画像の高さ(height)	*/
	cm   = header[28]/8;					/* cm=1:mono, 3:color	*/
	// カラーパレットの読み込み
	if(cm==1){
		for(j=0; j<1024; j++) pal[j] = fgetc(fp);
	}
	// 画素データの読み込み
	pad = ((4-(wdth % 4))*cm) % 4;	  /* パディングデータのバイト数	*/
	for(j=0; j<hght; j++){			  /* 画素データの取得			*/
		for(k=0; k<wdth; k++){
			for(l=0; l<cm; l++)	*(dat++) = fgetc(fp);
		}
		for(m=0; m<pad; m++)  
			dm = fgetc(fp);			  /* パディングデータのスキップ	*/
	}
	// BMPファイルのClose処理
	fclose(fp);
	// 画像サイズ,カラーモードをポインタ渡し
	*color_mode = cm; *height = hght; *width = wdth;
}


C6b14

Re: 初心者なのでまったく分かりませんでした…

#9

投稿記事 by C6b14 » 8年前

まず この OpenGL は 私が 数日まえ OpenCV の 練習を した ところの ページ と似ているので( 画像も )そこを よんでみること。OpenCV 画像処理 で 検索 すればいいはず。 結構 似てるので もしかしたら ... 。

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#10

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:まず この OpenGL は 私が 数日まえ OpenCV の 練習を した ところの ページ と似ているので( 画像も )そこを よんでみること。OpenCV 画像処理 で 検索 すればいいはず。 結構 似てるので もしかしたら ... 。
分かりました。 検索してみます!

C6b14

Re: 初心者なのでまったく分かりませんでした…

#11

投稿記事 by C6b14 » 8年前

プロジェクトの プロパティ で コマンドライン の 引数を 書く。構成ーー>Debugーーー->デバッグーー> コマンドライン引数を AAA と打って 実行。AAA  と出るのを 確認。-説明しにくいので いまはここまで。 妙なところに こってるいるので わからなければ 後回し。今日はおしまい。
出来れば bmp の 名前 サイズ がわかる なら 書いて書いてください。(わからなければ 不要)

C6b14

Re: 初心者なのでまったく分かりませんでした…

#12

投稿記事 by C6b14 » 8年前

サイトはここです。http://opencv.jp/cookbook/opencv_img.html。 サンプルが OpenCV で 全て動くし 画像処理 の例 がたくさんあるけど 「この プログラム」は すこし 複雑に書いてあるので 参考にならないかも です。写真はにてるけど。

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#13

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:サイトはここです。http://opencv.jp/cookbook/opencv_img.html。 サンプルが OpenCV で 全て動くし 画像処理 の例 がたくさんあるけど 「この プログラム」は すこし 複雑に書いてあるので 参考にならないかも です。写真はにてるけど。
わざわざサイトのURLまでありがとうございます…

hide

Re: 初心者なのでまったく分かりませんでした…

#14

投稿記事 by hide » 8年前

これは決まった課題なので難易度を下げるとかは難しそうです…
入門書が終わっていないようなレベルの本当の初心者だと、金曜までに仕上げるのはきついです。
1.の質問内容は画像処理以前の問題でこれを質問している段階だと結構厳しいと思われます。

期限が終わってから間に合いませんでした。と報告するようだと、間違いなくやる気がないと思われるので、
早い段階で言うべきだと言っています。(掲示板に質問するくらいなので最低限やる気はあるようですし。)
なので、実際に難易度を下げてもらえるかどうかとは別に、
まずは課題を出してもらう側としての常識として相談しないといけないです。

C6b14

Re: 初心者なのでまったく分かりませんでした…

#15

投稿記事 by C6b14 » 8年前

まず 画像がでて menu の シミュレーション が出来るか 確認。 goto 文を 取る方法 は後で 考えるとして menu の仕組みを 理解すること。 この先が大変のようですし。
http://csi.nisinippon.com/g001.png

コード:


#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "c1.h"

// グローバル変数
unsigned char   dat[720 * 480 * 3];         /* 原画像を格納する配列        */
unsigned char   result[720 * 480 * 3];      /* 処理画像を格納する配列     */
double          msk[3][3];              /* フィルタマスクの配列      */
int cm;                 /* Color Mode: cm = 1(モノクロ), 3(カラー)    */
int height, width;      /* height: 画像の高さ(y), width: 画像の幅(x) */

						// 画素の色成分を扱う構造体
typedef struct pixelColor {
	unsigned char R;
	unsigned char G;
	unsigned char B;
} pColor;

// キャンバスに画素値(色)を描画する関数
void draw_pixel(int x, int y, pColor c) {
	glColor3ub(c.R, c.G, c.B);          /* 指定色(pColor c)をセット   */
	glBegin(GL_POINTS);
	glVertex2d(x, y);               /* セットした色をキャンバス  */
	glEnd();                            /* (x,y)座標に描画       */
}

// キャンパスに画像を描画するコールバック関数
void display(void) {
	int x, y, n;                            /* x-y 座標 */
	pColor color;

	glClear(GL_COLOR_BUFFER_BIT);
	for (y = 0; y<height; y++) {
		/* 原画像の表示(左側)*/
		for (x = 0; x<width; x++) {
			switch (cm) {
			case 1:                         /* モノクロ画像の場合  */
				n = x + width*y;
				color.B = dat[n];           /* (x,y)の輝度値を取得   */
				color.G = dat[n];
				color.R = dat[n];
				draw_pixel(x, y, color);
				break;
			case 3:                         /* カラー画像の場合     */
				n = (x + width*y) * 3;
				color.B = dat[n];           /* (x,y)のRGB値を取得  */
				color.G = dat[n + 1];
				color.R = dat[n + 2];
				draw_pixel(x, y, color);
				break;
			default:
				printf("不正なカラーモードです.\n");
				exit(1);
			}
		}
		/* 処理画像の表示(右側)*/
		for (x = 0; x<width; x++) {
			switch (cm) {
			case 1:                         /* モノクロ画像の場合  */
				n = x + width*y;
				color.R = result[n];        /* (x,y)の輝度値を取得   */
				color.G = result[n];
				color.B = result[n];
				draw_pixel(x + width, y, color);
				break;
			case 3:                         /* カラー画像の場合     */
				n = (x + width*y) * 3;
				color.B = result[n];        /* (x,y)のRGB値を取得  */
				color.G = result[n + 1];
				color.R = result[n + 2];
				draw_pixel(x + width, y, color);
				break;
			default:
				printf("不正なカラーモードです.\n");
				exit(1);
			}
		}
	}
	glFlush();  /* キャンバスを表示 */
}

// ウィンドウサイズ変更時に座標設定を行うコールバック関数
void resize(int w, int h) {
	glViewport(0, 0, w, h);
	glLoadIdentity();
	gluOrtho2D(0, w, 0, h);
}

// GLUTによる画像表示(左:原画像,右:処理画像)
void glut_ShowResults(int argc, char** argv) {
	// ウィンドウの初期化
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutInitWindowSize(2 * width, height);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("image viewer");

	// クリアカラー(背景)を黒にセット
	glClearColor(0.0, 0.0, 0.0, 1.0);

	// コールバック関数
	glutDisplayFunc(display);
	glutReshapeFunc(resize);

	//イベント処理ループ
	glutMainLoop();
}

// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) {
	// 
	// 修正箇所② --- ここにコードを追加する
	//
}

// 原画像datをフィルタ処理してresultに格納
void imfilter(int menu_no) {
	int x, y, n;

	// フィルタマスクの初期化
	set_msk(menu_no);

	// 画像の各点でフィルタ処理を実行
	for (y = 0; y<height; y++) {
		for (x = 0; x<width; x++) {
			if (x>0 && y>0 && x<width - 1 && y<height - 1) {
				/* 画像の縁でない場合の処理 */
				//
				//  <修正箇所③ --- ここから>
				//  <以下はすべての画素に128を入れるダミーコード>
				//
				if (cm == 1) {
					n = x + width*y;
					result[n] = 128;
				}
				else {
					n = (x + width*y) * 3;
					result[n] = 128;
					result[n + 1] = 128;
					result[n + 2] = 128;
				}
				//  <修正箇所③ --- ここまで>
			}
			else {
				/* 画像の縁にあたる点の処理 */
				if (cm == 1) {
					n = x + width*y;
					result[n] = dat[n];
				}
				else {
					n = (x + width*y) * 3;
					result[n] = dat[n];
					result[n + 1] = dat[n + 1];
					result[n + 2] = dat[n + 2];
				}
			}
		}
	}
}

// フィルタメニューの表示
int filter_menu(void) {/////////////////////////////////////////////////// 005<---
	// 
	// 修正箇所① --- ここにコードを追加する
	//
	int num;
	printf("===== フィルター処理 =====\n");
	printf("  Menus\n");
	printf("  1.平滑 \n");
	printf("  2.鮮鋭 \n");
	printf("  3.ガウス\n");
	printf("  9. \n");
	printf("==========================\n");
	printf("Menu No.=");
	scanf("%d", &num);
label:
	switch (num) {
	case 1:
		//処理1
		printf("  1.平滑 ---実行\n");
		break;
	case 2:
		//処理2
		printf("  2.鮮鋭 ---実行 \n"); 
		break;
	case 3:
		//処理3
		printf("  3.ガウス ---実行\n"); 
		break;
	case 9:
		exit(0);
		break;
	default:
		//処理4
		printf("違う! :Menu No.=");
		scanf("%d", &num);
		goto label;
		break;
	}

	return 0;
}

// メイン関数
int main(int argc, char** argv) {

	argc = 2; // 引数の数 ////////////////////////////////////////////////// 001 引数を上書き[引数シミュレーション	]
	argv[1] = "d:\\img\\lenna.bmp";///////////////////////////////////////////// 002 (面倒なので作るときだけ  
	///////////////////////////////////////////////////////////////////////// 003 後で消せばよい)
	// BMP画像の読み込み
	if (argc<2) {
		printf("画像ファイルを指定してください.\n");
		exit(1);
	}
	///////////////////////////////////////////////////////////////////////// 004
	printf("---BMPファイルのOpen処理---\n");
	loadbmpfile(argv[1], &cm, &height, &width, dat);

	printf("file name: %s\n", argv[1]);
	printf("color mode = %d\nhight = %d, width = %d\n", cm, height, width);

	// 画像のフィルタ処理
	imfilter(filter_menu()); printf("// 画像のフィルタ処理");/////////////// 005---> 

	// GLUTによる処理画像の表示
	glut_ShowResults(argc, argv); printf("// GLUTによる処理画像の表示");//// 006 結果表示

	return 0;
}

C6b14

Re: 初心者なのでまったく分かりませんでした…

#16

投稿記事 by C6b14 » 8年前

あ、ヘッダー ファイル名 を かえてる ので もとに 戻して ください。

C614b

Re: 初心者なのでまったく分かりませんでした…

#17

投稿記事 by C614b » 8年前

プログラム的には 完成したので 分からないところを きいて ください。
http://csi.nisinippon.com/g002.png

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#18

投稿記事 by satoshi » 8年前

コード:


		argv[1] = "d:\\img\\lenna.bmp";///////////////////////////////////////////// 002 (面倒なので作るときだけ  
	///////////////////////////////////////////////////////////////////////// 003 後で消せばよい)
	
[/quote]

この 文の意味って言うのはこの女の人の画像を指定してあるってことですよね?  多分僕の書き方が悪かったかもしれないんですけど どの画像にも対応して表したかったんです…

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#19

投稿記事 by satoshi » 8年前

hide さんが書きました:
これは決まった課題なので難易度を下げるとかは難しそうです…
入門書が終わっていないようなレベルの本当の初心者だと、金曜までに仕上げるのはきついです。
1.の質問内容は画像処理以前の問題でこれを質問している段階だと結構厳しいと思われます。

期限が終わってから間に合いませんでした。と報告するようだと、間違いなくやる気がないと思われるので、
早い段階で言うべきだと言っています。(掲示板に質問するくらいなので最低限やる気はあるようですし。)
なので、実際に難易度を下げてもらえるかどうかとは別に、
まずは課題を出してもらう側としての常識として相談しないといけないです。

一応この課題は実験の一環なんですけど 他にもやってるひとがいて一応 条件は一緒なので相談は難しいです…

C6b14

Re: 初心者なのでまったく分かりませんでした…

#20

投稿記事 by C6b14 » 8年前

ん? 画像 は なでも いいはず。 べつに 白黒でも いいし。

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#21

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:ん? 画像 は なでも いいはず。 べつに 白黒でも いいし。

コード:

        argv[1] = "d:\\img\\lenna.bmp";///////////////////////////////////////////// 002 (面倒なので作るときだけ  
    ///////////////////////////////////////////////////////////////////////// 003 後で消せばよい)
この部分を入れるとどうしても表が出てこなくなるんです…

C6b14

Re: 初心者なのでまったく分かりませんでした…

#22

投稿記事 by C6b14 » 8年前

文の 意味は 実際の 出来上がったときは ここの 部分の プログラムは いらないよ  という意味です。         VisualStudio の使い方のぶぶんで あまり   使わない機能では    あるので わからない ひとも 多いので パソコン と VS2015 とかバージョンを 教えてください。
適当なサイト を見ないと かなり 使っている ひとでも 説明が ながく なります。 とりあえず 使ってる環境によるので それが 分からないと むつかしい。( 取りあえず 画像 を 選べるようには プロがラム はなっている。たぶん この意味がわかるには ちょっと パソコンの知識がいります。) いまは 一番の ネック になると思うので わからないことは あまり 考えすぎずに聞いてください。
ここには詳しいひとがたくさんいて うまく 説明 して 頂けます。

C6b14

Re: 初心者なのでまったく分かりませんでした…

#23

投稿記事 by C6b14 » 8年前

それと ここの ルール を見て パソコンの 使える程度とかわからないことは 説明しにくいですよ。(まず 画像のデータは 今まで使っていたものを フォルダーに 入れないといけない という事は 分かりませんか?)

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#24

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:文の 意味は 実際の 出来上がったときは ここの 部分の プログラムは いらないよ  という意味です。         VisualStudio の使い方のぶぶんで あまり   使わない機能では    あるので わからない ひとも 多いので パソコン と VS2015 とかバージョンを 教えてください。
適当なサイト を見ないと かなり 使っている ひとでも 説明が ながく なります。 とりあえず 使ってる環境によるので それが 分からないと むつかしい。( 取りあえず 画像 を 選べるようには プロがラム はなっている。たぶん この意味がわかるには ちょっと パソコンの知識がいります。) いまは 一番の ネック になると思うので わからないことは あまり 考えすぎずに聞いてください。
ここには詳しいひとがたくさんいて うまく 説明 して 頂けます。
Visual Studio2013 です パソコンは windows 8 です 

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#25

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:それと ここの ルール を見て パソコンの 使える程度とかわからないことは 説明しにくいですよ。(まず 画像のデータは 今まで使っていたものを フォルダーに 入れないといけない という事は 分かりませんか?)
はい 多分分かります

C6b14

Re: 初心者なのでまったく分かりませんでした…

#26

投稿記事 by C6b14 » 8年前

まず どんな 画像をいれたか と なにか エラーメッセージ がでてないか?。( それと 環境の件 を教えてください。)

C6b14

Re: 初心者なのでまったく分かりませんでした…

#27

投稿記事 by C6b14 » 8年前

VS2013 の Debug の 方法 はわかると思うので エラー 情報とか 何かの メッセージ が でてないですか。

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#28

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:まず どんな 画像をいれたか と なにか エラーメッセージ がでてないか?。( それと 環境の件 を教えてください。)
エラーは特になにも出てきませんでした
環境というのはどういうものですか?
最後に編集したユーザー satoshi on 2016年11月25日(金) 01:50 [ 編集 1 回目 ]

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#29

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:VS2013 の Debug の 方法 はわかると思うので エラー 情報とか 何かの メッセージ が でてないですか。
最終的な結果としては ガウシアンフィルタによる平滑化画像と 鮮鋭化フィルタにによるエッジ強調画像を表示させたいんです…
最後に編集したユーザー satoshi on 2016年11月25日(金) 01:49 [ 編集 5 回目 ]

C6b14

Re: 初心者なのでまったく分かりませんでした…

#30

投稿記事 by C6b14 » 8年前

情報の行き違いです。(VS2013:Win8)。コマンドプロンプトで 使えるのなら main 関数 の 引数 で ファイルを 選べるんだから 001,002 をコメントアウト すればいいですよ。

それは 分かっているかど アルゴリズム までは作れないから プログラム全体を 早く作って 自力で作って。そちらは 専門だからすぐできるはず。( この レベル で作った例が ない。みな 簡単な OpenCV とか OpenGL の 命令だし。)
私もしりたいので http://dixq.net/forum/viewtopic.php?f=3&t=18543に 前に作ったOpenGL の 画像描画 を見て考えて!

C6b14

Re: 初心者なのでまったく分かりませんでした…

#31

投稿記事 by C6b14 » 8年前

マスク値 の マトリクス部分はこれでいいのかな?。そちらの方は専門でしょうから 教えてほしい。

コード:

// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
	// 
	// 修正箇所② --- ここにコードを追加する
	//
	printf("AAA101-------------->");
	switch (menu_no) {
	case 1:
		//処理1
		printf("  AAA1.平滑 ---実行\n");
		msk[0][0] = 0;   msk[0][1] = -1.0; msk[0][2] = 0;
		msk[1][0] = 1.0;   msk[1][1] = 5.0; msk[1][2] = -1.0;
		msk[2][0] = 0;   msk[2][1] = -1.0; msk[2][2] = 0;
		//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0 
		//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
		//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
		break;
	case 2:
		//処理2
		printf("  2.鮮鋭 ---実行 \n");
		msk[0][0] = -1.0;   msk[0][1] = -1.0; msk[0][2] = -1.0;
		msk[1][0] = -1.0;   msk[1][1] = -9.0; msk[1][2] = -1.0;
		msk[2][0] = -0.0;   msk[2][1] = -1.0; msk[2][2] = 0;
		break;
	case 3:
		//処理3
		printf("  3.ガウス ---実行\n");
		msk[0][0] = 1;   msk[0][1] = 2.0; msk[0][2] = 1.0;
		msk[1][0] = 2.0;   msk[1][1] = 4.0; msk[1][2] = 2.0;
		msk[2][0] = 1;   msk[2][1] = 2.0; msk[2][2] = 1.0;
		break;
	}
}

C6b14

Re: 初心者なのでまったく分かりませんでした…

#32

投稿記事 by C6b14 » 8年前

マスク値 の マトリクス 部分 は これで いいのかな?。この辺は こちらがききたい。

コード:

// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
	// 
	// 修正箇所② --- ここにコードを追加する
	//
	printf("AAA101-------------->");
	switch (menu_no) {
	case 1:
		//処理1
		printf("  AAA1.平滑 ---実行\n");
		msk[0][0] = 0;   msk[0][1] = -1.0; msk[0][2] = 0;
		msk[1][0] = 1.0;   msk[1][1] = 5.0; msk[1][2] = -1.0;
		msk[2][0] = 0;   msk[2][1] = -1.0; msk[2][2] = 0;
		//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0 
		//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
		//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
		break;
	case 2:
		//処理2
		printf("  2.鮮鋭 ---実行 \n");
		msk[0][0] = -1.0;   msk[0][1] = -1.0; msk[0][2] = -1.0;
		msk[1][0] = -1.0;   msk[1][1] = -9.0; msk[1][2] = -1.0;
		msk[2][0] = -0.0;   msk[2][1] = -1.0; msk[2][2] = 0;
		break;
	case 3:
		//処理3
		printf("  3.ガウス ---実行\n");
		msk[0][0] = 1;   msk[0][1] = 2.0; msk[0][2] = 1.0;
		msk[1][0] = 2.0;   msk[1][1] = 4.0; msk[1][2] = 2.0;
		msk[2][0] = 1;   msk[2][1] = 2.0; msk[2][2] = 1.0;
		break;
	}
}

C6b14

Re: 初心者なのでまったく分かりませんでした…

#33

投稿記事 by C6b14 » 8年前

これ以上は みんなの迷惑になるので やめますね。http://xyz2cs6vb14p19.hatenablog.com/

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#34

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:情報の行き違いです。(VS2013:Win8)。コマンドプロンプトで 使えるのなら main 関数 の 引数 で ファイルを 選べるんだから 001,002 をコメントアウト すればいいですよ。

それは 分かっているかど アルゴリズム までは作れないから プログラム全体を 早く作って 自力で作って。そちらは 専門だからすぐできるはず。( この レベル で作った例が ない。みな 簡単な OpenCV とか OpenGL の 命令だし。)
私もしりたいので http://dixq.net/forum/viewtopic.php?f=3&t=18543に 前に作ったOpenGL の 画像描画 を見て考えて!
分かりました。頑張ってみます。 最後にちょっと質問なんですけど imfilterで番号を指定した後set_mask にガウシアンフィルタを処理するプログラムを書くらしいんですけどそのプログラムを実行させるプログラムの書き方って分かったりします? 分からなかったらいいんですけど…

C6b14

Re: 初心者なのでまったく分かりませんでした…

#35

投稿記事 by C6b14 » 8年前

( 返 不要)

コード:

// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101

	// 
	// 修正箇所② --- ここにコードを追加する
	//
	printf("AAA101-------------->");
	switch (menu_no) {
	case 1:
		//処理1
		printf("  AAA1.平滑 ---実行\n");
		msk[0][0] = 0;   msk[0][1] = -1.0; msk[0][2] = 0;
		msk[1][0] = 1.0;   msk[1][1] = 5.0; msk[1][2] = -1.0;
		msk[2][0] = 0;   msk[2][1] = -1.0; msk[2][2] = 0;
		//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0 
		//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
		//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
		break;
	case 2:
		//処理2
		printf("  2.鮮鋭 ---実行 \n");
		msk[0][0] = -1.0;   msk[0][1] = -1.0; msk[0][2] = -1.0;
		msk[1][0] = -1.0;   msk[1][1] = -9.0; msk[1][2] = -1.0;
		msk[2][0] = -0.0;   msk[2][1] = -1.0; msk[2][2] = 0;
		break;
	case 3:
		//処理3
		printf("  3.ガウス ---実行\n");
		msk[0][0] = 1;   msk[0][1] = 2.0; msk[0][2] = 1.0;
		msk[1][0] = 2.0;   msk[1][1] = 4.0; msk[1][2] = 2.0;
		msk[2][0] = 1;   msk[2][1] = 2.0; msk[2][2] = 1.0;
		break;
	}
}

// 原画像datをフィルタ処理してresultに格納
void imfilter(int menu_no) {     ///////////////////////////////////////  006
	int x, y, n;
	// フィルタマスクの初期化
	set_msk(menu_no);
	// 画像の各点でフィルタ処理を実行
	for (y = 0; y<height; y++) {
		for (x = 0; x<width; x++) {
			if (x>0 && y>0 && x<width - 1 && y<height - 1) {
				/* 画像の縁でない場合の処理 */
				//
				//  <修正箇所③ --- ここから>
				//  <以下はすべての画素に128を入れるダミーコード>
				///////////////////////////////////////////////////////////////////
				if (cm == 1) {
					n = x + width*y;
					result[n] = dat[n];
				}
				else {
					n = (x + width*y) * 3;
					result[n] = dat[n];
					result[n + 1] = dat[n];
					result[n + 2] = dat[n];
				}
				///////////////////////////////////////////////////////////////////
				//  <修正箇所③ --- ここまで>
			}
			else {
				/* 画像の縁にあたる点の処理 */
				if (cm == 1) {
					n = x + width*y;
					result[n] = dat[n];
				}
				else {
					n = (x + width*y) * 3;
					result[n] = dat[n];
					result[n + 1] = dat[n + 1];
					result[n + 2] = dat[n + 2];
				}
			}
		}
	}
}

// フィルタメニューの表示
int filter_menu(void) {/////////////////////////////////////////////////// 005<---
	// 
	// 修正箇所① --- ここにコードを追加する
	//
	int num;
	printf("===== フィルター処理 =====\n");
	printf("  Menus\n");
	printf("  1.平滑 \n");
	printf("  2.鮮鋭 \n");
	printf("  3.ガウス\n");
	printf("  9. \n");
	printf("==========================\n");
	printf("Menu No.=");
	scanf("%d", &num);
label:
	switch (num) {
	case 1:
		//処理1
		printf("  1.平滑 ---実行\n");
		imfilter(num); /////////////////////////////////////////////////// 
		break;
	case 2:
		//処理2
		printf("  2.鮮鋭 ---実行 \n"); 
		imfilter(num); /////////////////////////////////////////////////// 
		break;
	case 3:
		//処理3
		printf("  3.ガウス ---実行\n"); 
		imfilter(num); /////////////////////////////////////////////////// 
		break;
	case 9:
		exit(0);
		break;
	default:
		//処理4
		printf("違う! :Menu No.=");
		scanf("%d", &num);
		goto label;
		break;
	}

	return 0;
}

// メイン関数
int main(int argc, char** argv) {

	//argc = 2; // 引数の数 ////////////////////////////////////////////////// 001 引数を上書き[引数シミュレーション]
	//argv[1] = "d:\\img\\lenna.bmp";////////////////////////////////////////// 002 (面倒なので作るときだけ  
	///////////////////////////

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#36

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:マスク値 の マトリクス 部分 は これで いいのかな?。この辺は こちらがききたい。

コード:

// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
	// 
	// 修正箇所② --- ここにコードを追加する
	//
	printf("AAA101-------------->");
	switch (menu_no) {
	case 1:
		//処理1
		printf("  AAA1.平滑 ---実行\n");
		msk[0][0] = 0;   msk[0][1] = -1.0; msk[0][2] = 0;
		msk[1][0] = 1.0;   msk[1][1] = 5.0; msk[1][2] = -1.0;
		msk[2][0] = 0;   msk[2][1] = -1.0; msk[2][2] = 0;
		//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0 
		//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
		//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
		break;
	case 2:
		//処理2
		printf("  2.鮮鋭 ---実行 \n");
		msk[0][0] = -1.0;   msk[0][1] = -1.0; msk[0][2] = -1.0;
		msk[1][0] = -1.0;   msk[1][1] = -9.0; msk[1][2] = -1.0;
		msk[2][0] = -0.0;   msk[2][1] = -1.0; msk[2][2] = 0;
		break;
	case 3:
		//処理3
		printf("  3.ガウス ---実行\n");
		msk[0][0] = 1;   msk[0][1] = 2.0; msk[0][2] = 1.0;
		msk[1][0] = 2.0;   msk[1][1] = 4.0; msk[1][2] = 2.0;
		msk[2][0] = 1;   msk[2][1] = 2.0; msk[2][2] = 1.0;
		break;
	}
}

コード:

void set_msk(int menu_no){

	int x=0, y=0 ,n=0;
	double sum;
	switch (menu_no){
	case 1:
		msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
		msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
		msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
		break;
	case 2:
		n = x + width*y;
		sum = 0.0;
		sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
		sum += msk[0][1] * dat[x + width*(y - 1)];
		sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
		sum += msk[1][0] * dat[(x - 1) + width*   y];
		sum += msk[1][1] * dat[x + width*   y];
		sum += msk[1][2] * dat[(x + 1) + width*   y];
		sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
		sum += msk[2][1] * dat[x + width*(y + 1)];
		sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
		if (sum < 0) sum = 0.0;
		else if (sum > 255) sum = 255.0;
		result[n] = (unsigned char)sum;
		break;
	}

}
課題と一緒にもらった資料を見たら画像のようなプログラムが載っていたのでcase1 case2の時ともにこれであっていると思います。 でもなぜかこれではまだ左に処理後の表示されないんですけど あとちょっと頑張ってみます。 ありがとうございます。
最後に編集したユーザー satoshi on 2016年11月25日(金) 01:45 [ 編集 1 回目 ]

C6b14

Re: 初心者なのでまったく分かりませんでした…

#37

投稿記事 by C6b14 » 8年前

なーんだ。それがあれば もうできたようなものです。いまから ほんき で がんばればできると おもう。 

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#38

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:なーんだ。それがあれば もうできたようなものです。いまから ほんき で がんばればできると おもう。 
なんか頑張って色々と調べてみたんですけど やっぱり色々試したんですけど処理されていない画像が右側に出てきてしまって… これプログラムが間違ってるんですかね? それともまだなにか マスク値に入れないといけないプログラムがあるんですかね?

C6b14

Re: 初心者なのでまったく分かりませんでした…

#39

投稿記事 by C6b14 » 8年前

とうぜん、そのままでは ロジックは くみこまれない のは わかるでしょう。 いま どういう 出力 なのか 画像 をみてみないと わからないので。 修正箇所②  と 修正箇所③ にただしい ロジック いれないと (それは 専門 なので わかるはず )。

プログラムは さいしょ みたところ 1, 2, 3 ( 1.平滑 2.鮮鋭 3.ガウス ) が ひつようなのか どこまで せいじょうなのか ひじょうに あやふやに みえるので。[ なんにも できて なかった : それは気になったし 他のかたもしてきされたし]
 まず 出力画像 と プログラム を見せて。  (case ぶん のかず も あわないし やること がみえないから ) 
かんたんに フローチャート ( かんたん らくがき レベル でいい )をのせてください。それと やはり 環境 がきにはなる。( VS2013 の Debug の を どのように つかって いるのか または Release を使って いるのか )ここの ルール や 
http://dixq.net/forum/viewtopic.php?f=3&t=18583のように書かないと。ルールで まるなげはきんしだし。 まあ わたしもしりたいことなので かんがえて みたいの で まず そちらの ベクトル と こちらの ベクトル がずれてるので ちがう ほうこうに いく から。(そちらは わかることでも こちらには 説明がないと 。 画像処理の原理なんて まったく しりません )  
まず ルール。それから 現状を知らせてほしい。 (わからいこと が わからないので しつもん をしぼって )。こちらもわかりやすくかきかえるから。

C6b14

Re: 初心者なのでまったく分かりませんでした…

#40

投稿記事 by C6b14 » 8年前

* [F11] で 「変数の 変化を おいかけること」が できるのか どうか を ルールに に則って 書いてください。

sky

Re: 初心者なのでまったく分かりませんでした…

#41

投稿記事 by sky » 8年前

1.filter_menuの部分を 表示されたメニュー以外の番号指定した場合はコンソールで再度Menu番号の入力を促して、9を入力した場合は、処理を行わずプログラムを終了するというプログラムがどんなものかよく分かりません(どんなものかは添付のフィルタ処理プログラムの文字が入ってるもの)
2.Menu番号1が入力されたときガウシアンフィルタによる平滑化を実行して処理画像の右側に表示する(添付してある写真の何も写ってない方に)ガウシアンフィルタのマスク値(図3.3)にセットしてset_maskにコードを追加してガウシアンフィルタによる平滑化の値を計算してresultに格納するようimfilterを修正したプログラムが考えても分かりません
3.Menu番号2が入力されたとき鮮鋭化フィルタによるエッジ強調を実行し処理画像の右側に表示する。図3.6に示す鮮鋭化フィルタのマスク値にセットするようset_maskにコードを追加して画素毎に鮮鋭化フィルタによるエッジ強調出力の値を計算してresultに格納するようimfilterを修正したプログラムが分かりません
先週の金曜から毎日色々なサイトを見て考えているんですけど どうしてもわからなくて

c言語の基礎はわかっていますか?基本的なことが分かっている人でないならこんな問題考えないですよね、
一つ提案がコメントを山ほど1行に一つずつ入れてみることです、そうすると自分がどの項目が理解できてないのか
わかるでしょう、つまりなんでも呑み込むことです、間違っててもいいコメントを入れて投稿してください
そうすると「ここはまちがってますよ」と指摘がありますから、それから修正すればいい。

C6b14

Re: 初心者なのでまったく分かりませんでした…

#42

投稿記事 by C6b14 » 8年前

あれだけの 資料があれば もしかして、もうできた?。
もし まだなら 投稿のかたのいわれる とうり コメントいり プログラム をなげて もらえば いろいろ ヒント を もらえると 思います。プログラム の 問題 だけの よう なので。( C では あまり かかないので 詳し人からの ヒントで わかるはず )。 ひとつ まえの 私の投稿は 無視して ください。( それと別スレ[再質問] に してもらえば )

C6b14

Re: 初心者なのでまったく分かりませんでした…

#43

投稿記事 by C6b14 » 8年前

さいごの資料で ロジック をくめば 平滑化(ガウシアン) される みたい。
画像

C6b14

Re: 初心者なのでまったく分かりませんでした…

#44

投稿記事 by C6b14 » 8年前

とりあえず (いるのなら)いまの コードを 送ってもらえば いいですよ。 わかってしまえば かんたん だし  わからないときは すごく 難しく みえるから。

C6b14

Re: 初心者なのでまったく分かりませんでした…

#45

投稿記事 by C6b14 » 8年前

はやい はなし Matrix 設定部分 と   dat  平滑化部分 に分割しないと ...

コード:

	switch (menu_no) {
	case 1:
		msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
		msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
		msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
		break;
(白黒画像 部分)
double sum;// 宣言に追加する

コード:

				//  <修正箇所③ --- ここから>
				//  <以下はすべての画素に128を入れるダミーコード>
				///////////////////////////////////////////////////////////////////
				if (cm == 1) {
					n = x + width*y;

					sum = 0.0;
					sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
					sum += msk[0][1] * dat[x + width*(y - 1)];
					sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
					sum += msk[1][0] * dat[(x - 1) + width*   y];
					sum += msk[1][1] * dat[x + width*   y];
					sum += msk[1][2] * dat[(x + 1) + width*   y];
					sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
					sum += msk[2][1] * dat[x + width*(y + 1)];
					sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
					if (sum < 0) sum = 0.0;
					else if (sum > 255) sum = 255.0;
					result[n] = (unsigned char)sum;
					// result[n] = dat[n];
				}
				else {

satoshi
記事: 17
登録日時: 8年前

Re: 初心者なのでまったく分かりませんでした…

#46

投稿記事 by satoshi » 8年前

C6b14 さんが書きました:はやい はなし Matrix 設定部分 と   dat  平滑化部分 に分割しないと ...

コード:

	switch (menu_no) {
	case 1:
		msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
		msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
		msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
		break;
(白黒画像 部分)
double sum;// 宣言に追加する

コード:

					if (cm == 1) {
					n = x + width*y;

					sum = 0.0;
					sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
					sum += msk[0][1] * dat[x + width*(y - 1)];
					sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
					sum += msk[1][0] * dat[(x - 1) + width*   y];
					sum += msk[1][1] * dat[x + width*   y];
					sum += msk[1][2] * dat[(x + 1) + width*   y];
					sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
					sum += msk[2][1] * dat[x + width*(y + 1)];
					sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
					if (sum < 0) sum = 0.0;
					else if (sum > 255) sum = 255.0;
					result[n] = (unsigned char)sum;
					// result[n] = dat[n];
				}
				else {

コード:

void set_msk(int menu_no){

	int x=0, y=0 ,n=0;
	double sum;
	switch (menu_no){
	case 1:
		msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
		msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
		msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
		break;
	
	case 2:
		msk[0][0] = 0.0;   msk[0][1] = -1.0; msk[0][2] = 0.0;
		msk[1][0] = -1.0;   msk[1][1] = 5.0; msk[1][2] = -1.0;
		msk[2][0] = -0.0;   msk[2][1] = -1.0; msk[2][2] = 0;
		break;
	}

}

// 原画像datをフィルタ処理してresultに格納
void imfilter(int menu_no){
	int x, y, n;
	double sum;
	// フィルタマスクの初期化
	set_msk(menu_no);

	// 画像の各点でフィルタ処理を実行
	for(y=0; y<height; y++){
		for(x=0; x<width; x++){
			if(x>0 && y>0 && x<width-1 && y<height-1){	
								if(cm==1){
					n = x + width*y;
					sum = 0.0;
					sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
					sum += msk[0][1] * dat[x + width*(y - 1)];
					sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
					sum += msk[1][0] * dat[(x - 1) + width*   y];
					sum += msk[1][1] * dat[x + width*   y];
					sum += msk[1][2] * dat[(x + 1) + width*   y];
					sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
					sum += msk[2][1] * dat[x + width*(y + 1)];
					sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
					if (sum < 0) sum = 0.0;
					else if (sum > 255) sum = 255.0;
					result[n] = (unsigned char)sum;
					
				}
				else{
					n = (x+width*y)*3;
					result[n] = dat[n];
					result[n+1] =dat[n+1];
					result[n+2] =dat[n+2];
				}
							}
			else{
				/* 画像の縁にあたる点の処理 */
				if(cm==1){
					n = x+width*y;
					result[n] = dat[n];
				}
				else{
					n = (x+width*y)*3;
					result[n] = dat[n];
					result[n+1] = dat[n+1];
					result[n+2] = dat[n+2];
				}
			}
		}
	}
}

このコードを書いたら実行結果でこうでました おそらくこれで正解だと思います!  ほんとにありがとうございました… あと後々のことを考えて質問がしたくて 環境はどういったものですか?って質問なんですけど 環境がよく分かんなくて例えばどういったものなんですか?
最後に編集したユーザー satoshi on 2016年11月25日(金) 01:47 [ 編集 1 回目 ]

C6b14

Re: 初心者なのでまったく分かりませんでした…

#47

投稿記事 by C6b14 » 8年前

[環境] とは パソコン環境 の省略形 で つまり パソコンの機種 とか 型 OS , VisualStudio2013 、 使っている付属品 などで 質問に 関係 する ハード と ソフト のことです。
「とくに 映像 関係 は 機材に 依存する ことが あるので」 答えが ちがう からです。

C6b14

Re: 初心者なのでまったく分かりませんでした…

#48

投稿記事 by C6b14 » 8年前

コード:

void set_msk(int menu_no){
 
    int x=0, y=0 ,n=0;
    double sum;
    switch (menu_no){

int x=0, y=0 ,n=0;
double sum;
は いらない。
[あとで けす つもり だと 思うけど 念のため]

とおりんすがりん

Re: 初心者なのでまったく分かりませんでした…

#49

投稿記事 by とおりんすがりん » 8年前

通りすがりですがその使ってる画像とプログラムから大体特定しますた
忠告しとくとあんまりこういうとこで聞くもんじゃないですよ

C6b14

Re: 初心者なのでまったく分かりませんでした…

#50

投稿記事 by C6b14 » 8年前

それは そう思いますよね。まあ これから こういう質問には 答えられないですよ。 もっと 一般的な 質問なら いいけれども。

閉鎖

“C言語何でも質問掲示板” へ戻る