#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;
}
2.Menu番号1が入力されたときガウシアンフィルタによる平滑化を実行して処理画像の右側に表示する(添付してある写真の何も写ってない方に)ガウシアンフィルタのマスク値(図3.3)にセットしてset_maskにコードを追加してガウシアンフィルタによる平滑化の値を計算してresultに格納するようimfilterを修正したプログラムが考えても分かりません
3.Menu番号2が入力されたとき鮮鋭化フィルタによるエッジ強調を実行し処理画像の右側に表示する。図3.6に示す鮮鋭化フィルタのマスク値にセットするようset_maskにコードを追加して画素毎に鮮鋭化フィルタによるエッジ強調出力の値を計算してresultに格納するようimfilterを修正したプログラムが分かりません
先週の金曜から毎日色々なサイトを見て考えているんですけど どうしてもわからなくて 期限が今週の金曜日までで終わらなくて焦ってます… どなたかプログラムを教えていただけるとありがたいです…