解決済みの質問
Sobelフィルタでエッジ抽出したいのですが、うまくいきません。 /*ディザ画像を作...
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
-
- 質問日時:
- 2011/6/29 23:27:31
-
- 解決日時:
- 2011/7/1 00:06:11
-
- 回答数:
- 1
-
- 閲覧数:
- 303
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
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
ではないですか?
- 違反報告
- 回答日時:2011/6/30 11:27:10
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
0人が役に立つと評価しています。

