ここから本文です

解決済みの質問

Sobelフィルタでエッジ抽出したいのですが、うまくいきません。 /*ディザ画像を作...

new_ancafeさん

Sobelフィルタでエッジ抽出したいのですが、うまくいきません。
/*ディザ画像を作る*/というところを直したらいいと思うのですが、
どうしたらいいのかもう分かりません。
心やさしい方教えてはくれませんか?

/*組織的ディザ法のプログラム dither.c*/
#include<stdio.h>
#include<stdlib.h>
#include"mypgm.h" //これは文字制限で掲載できない
#define BLOCK_SIZE 4 /* ブロックの横(=縦)画素数 */
#define NEW_LEVEL 16 /* 擬似階調数(= BLOCK_SIZE の2乗) */

void make_dither_image( )
/* 原画像 image1[y][x] のディザ画像を作り image2[y][x] に代入 */
{
double width; /* 16段階画像の階調値の単位幅 */
int new_gray; /* 新しい階調(16階調での値) */
int x_block, y_block; /* 横・縦のブロック数 */
int x, y, i, j, m, n; /* 制御変数 */
int dither_matrix [3][3] = { /* Sobel(縦)型ディザ行列 */
{ 1, 2, 1},
{ 0, 0, 0},
{-1,-2,-1},
};
/* 横,縦の画素数がBLOCK_SIZEの倍数であるかのチェック */
if ( x_size1 % BLOCK_SIZE != 0 || y_size1 % BLOCK_SIZE != 0 ){
printf("原画像の横・縦の画素数が不適切です.\n");
exit(1);
}
/* 16階調の画像を作る */
width = MAX_BRIGHTNESS / (double)NEW_LEVEL;
x_size2 = x_size1; y_size2 = y_size1;
for ( y = 0; y < y_size1; y ++ ){
for ( x = 0; x < x_size1; x ++ ){
new_gray = (int)( image1[y][x] / width );
if ( new_gray > NEW_LEVEL - 1 )
new_gray = NEW_LEVEL - 1;
image2[y][x] = (unsigned char)new_gray;
}
}
/* ディザ画像を作る */
printf("ディザ画像を作ります.\n");
x_block = x_size1 / BLOCK_SIZE; /* 横のブロック数 */
y_block = y_size1 / BLOCK_SIZE; /* 縦のブロック数 */
for ( i = 0; i < y_block; i ++ ){
for ( j = 0; j < x_block; j ++ ){
x = BLOCK_SIZE * j; y = BLOCK_SIZE * i;
for ( m = 0; m < BLOCK_SIZE; m ++ ){
for ( n = 0; n < BLOCK_SIZE; n ++ ){
if ( image2[y + m][x + n] <= dither_matrix[m][n] )
image2[y + m][x + n] = 0;
else image2[y + m][x + n] = MAX_BRIGHTNESS;
}
}
}
}
}

main( )
{
load_image_data( );
make_dither_image( );
save_image_data( );
return 0;
}

補足
mypgm.hは以下にあります。

http://www.mediafire.com/?q1vvkovj40yu4tj

違反報告

ベストアンサーに選ばれた回答

ehaesakaさん

パッと見で、勘違いでしたらごめんなさい。

>for ( m = 0; m < BLOCK_SIZE; m ++ ){
>for ( n = 0; n < BLOCK_SIZE; n ++ ){
>if ( image2[y + m][x + n] <= dither_matrix[m][n] )

のところで、BLOCK_SIZE が 4 な訳だから m = 0~3 の変化をすると
思われるのですが(nも同じ)、一方

>int dither_matrix [3][3] = { /* Sobel(縦)型ディザ行列 */
>{ 1, 2, 1},
>{ 0, 0, 0},
>{-1,-2,-1},
>};

な訳で、m=3 とか n=3 の場合に dither_matrix の範囲を
越えてしまうと思うのですが、この点がひっかかりました。

>#define BLOCK_SIZE 4



#define BLOCK_SIZE 3

ではないですか?

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 0点(5点満点中)0人が役に立つと評価しています。

知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

話題のキーワード

[カテゴリ:C言語関連]

ただいまの回答者

20時30分現在

3810
人が回答!!

1時間以内に7,119件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する