画像処理
Posted: 2011年10月12日(水) 09:37
言語:C
環境:Linux
画像処理に関して全くの初心者です。
以下の未完のプログラムを完成させるという課題なのですが、全く見当もつきません。
なので、お手伝いしていただきたいと思います。
よろしくお願いします。
環境:Linux
画像処理に関して全くの初心者です。
以下の未完のプログラムを完成させるという課題なのですが、全く見当もつきません。
なので、お手伝いしていただきたいと思います。
よろしくお願いします。
/* Sobel 水平方向微分フィルタ sobel.c */
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include"mypgm.h"
void spacial_filtering(img1, img2, x_sz, y_sz )
unsigned char img1[MAX_SIZE][MAX_SIZE], img2[MAX_SIZE][MAX_SIZE];
int x_sz, y_sz;
/* 画像の空間フィルタリングを行う. */
/* Sobelフィルタ(水平方向微分) */
/* 原画像 image1[y][x] ===> 変換後の画像 image2[y][x] */
{
/* 適用するフィルタの定義(Sobel水平方向微分) */
int weight[3][3] = {
{ -1, 0, 1 },
{ -2, 0, 2 },
{ -1, 0, 1 } };
double div_const = 1.0; /* <== 最後に割る値 */
double pixel_value; /* 計算値 */
double min, max; /* 計算値の最小値,最大値 */
int x, y, i, j; /* ループ変数 */
/* フィルタリング後の階調値の最小値,最大値を求める */
// printf("原画像のフィルタリングをしています.\n");
printf("Now dong filtering.\n");
min = (double)INT_MAX;
max = (double)INT_MIN;
for ( y = 1; y < y_sz - 1; y ++ ){
for ( x = 1; x < x_sz - 1; x ++ ){
pixel_value = 0.0;
for ( i = - 1; i < 2; i ++ )
for ( j = -1; j < 2; j ++ )
pixel_value = pixel_value +
weight[i + 1][j + 1] * img1[y + i][x + j];
pixel_value = pixel_value / div_const;
if ( pixel_value < min ) min = pixel_value;
if ( pixel_value > max ) max = pixel_value;
}
}
if ( (int)(max - min) == 0 ) exit(1);
/* img2[y][x] の初期化(外郭の画素のため)*/
for ( y = 0; y < y_sz; y ++ )
for ( x = 0; x < x_sz; x ++ )
img2[y][x] = 0;
/* 処理後の値を線形変換してから img2 に代入 */
for ( y = 1; y < y_sz - 1; y ++ ){
for ( x = 1; x < x_sz - 1; x ++ ){
pixel_value = 0.0;
for ( i = - 1; i < 2; i ++ )
for ( j = -1; j < 2; j ++ )
pixel_value = pixel_value +
weight[i + 1][j + 1] * img1[y + i][x + j];
pixel_value = pixel_value / div_const;
pixel_value = MAX_BRIGHTNESS /
( max - min ) * ( pixel_value - min );
img2[y][x] = (unsigned char)pixel_value;
}
}
}
main( )
{
load_image_data( image1, "test.pgm"); /* 画像を読み込んで image1 へ */
spacial_filtering(image1,image2, x_size, y_size );
/* Sobelの結果を2値化することでさらに結果を見やすくするような工夫をここで何かをやってみよう */
save_image_data(image2, x_size, y_size ); /* image2 を保存する */
return 0;
}