ページ 11

画像処理

Posted: 2011年10月12日(水) 09:37
by カイト
言語:C
環境: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;
}

Re: 画像処理

Posted: 2011年10月12日(水) 10:53
by softya(ソフト屋)
それなりに高度な内容ですので、初心者に出される課題とも思えません。
せめて、このプログラムのアルゴリズム的な説明と未完部分の説明をお願いします。
あと画像の処理前と処理後のサンプルもお願いします。