ページ 1 / 1
初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 18:15
by satoshi
コード:
#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;
}
1.filter_menuの部分を 表示されたメニュー以外の番号指定した場合はコンソールで再度Menu番号の入力を促して、9を入力した場合は、処理を行わずプログラムを終了するというプログラムがどんなものかよく分かりません(どんなものかは添付のフィルタ処理プログラムの文字が入ってるもの)
2.Menu番号1が入力されたときガウシアンフィルタによる平滑化を実行して処理画像の右側に表示する(添付してある写真の何も写ってない方に)ガウシアンフィルタのマスク値(図3.3)にセットしてset_maskにコードを追加してガウシアンフィルタによる平滑化の値を計算してresultに格納するようimfilterを修正したプログラムが考えても分かりません
3.Menu番号2が入力されたとき鮮鋭化フィルタによるエッジ強調を実行し処理画像の右側に表示する。図3.6に示す鮮鋭化フィルタのマスク値にセットするようset_maskにコードを追加して画素毎に鮮鋭化フィルタによるエッジ強調出力の値を計算してresultに格納するようimfilterを修正したプログラムが分かりません
先週の金曜から毎日色々なサイトを見て考えているんですけど どうしてもわからなくて 期限が今週の金曜日までで終わらなくて焦ってます… どなたかプログラムを教えていただけるとありがたいです…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 19:35
by C6b14
まず こんな 画面 は でてます か?。
http://csi.nisinippon.com/0001.png
( それと #include "..\imageio.h" は 開示 出来る ? )
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 20:07
by hide
本当に一切全くわからないのであれば、
期限の延長や難易度を下げた課題を今すぐお願いしてくるべきです。
初心者にソースコードを渡したところで、どうせ次の課題は解けないので
課題を課した側から見ても誰もいいことはありません。
時間を無駄にしないためにすぐに申し出るべきです。
長期の体調不良などがあったのであれば相談すべきですし、そうでなくても必要です。
そうでないのであればもっと具体的な質問ができるはずです。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 22:23
by satosh
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 22:25
by satoshi
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 22:27
by satoshi
hide さんが書きました:本当に一切全くわからないのであれば、
期限の延長や難易度を下げた課題を今すぐお願いしてくるべきです。
初心者にソースコードを渡したところで、どうせ次の課題は解けないので
課題を課した側から見ても誰もいいことはありません。
時間を無駄にしないためにすぐに申し出るべきです。
長期の体調不良などがあったのであれば相談すべきですし、そうでなくても必要です。
そうでないのであればもっと具体的な質問ができるはずです。
これは決まった課題なので難易度を下げるとかは難しそうです…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 22:35
by C6b14
う~ん、そのかわり がんばって ヒント だけで 解けるよう 頑張ってください。
でないと いわれた ことは もっとも なので ”自分のため” ですから。
( .h ファイルを 載せてかださい。)
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 22:45
by satoshi
C6b14 さんが書きました:う~ん、そのかわり がんばって ヒント だけで 解けるよう 頑張ってください。
でないと いわれた ことは もっとも なので ”自分のため” ですから。
( .h ファイルを 載せてかださい。)
分かりました! 頑張ってみます!
コード:
#include <stdio.h>
#include <string.h>
void loadbmpfile(char *loadfile, int *color_mode,
int *height, int *width, unsigned char *dat){
FILE *fp;
char fname[80]; /* BMPファイル名 */
unsigned char header[54]; /* ヘッダ格納用 */
int wdth, hght, cm; /* width, hight, color_mode */
int pal[1024]; /* カラーパレット格納用 */
int pad, dm; /* パディングデータ格納用 */
int j, k, l, m; /* ループ変数 */
// BMPファイルのOpen処理
strcpy(fname, loadfile);
if(strstr(fname, ".bmp")==NULL) strcat(fname, ".bmp");
fp = fopen(fname, "rb");
if(fp==NULL){
printf("Can't find file: \"%s\".\n", loadfile); exit(-1);
}
// ヘッダ部の読み込み
for(j=0; j<54; j++) header[j] = fgetc(fp);
if(!(header[0]=='B'&& header[1]=='M')){
printf("\"%s\" is not BMP file.\n", loadfile); exit(-1);
}
// 画像サイズ,カラーモードの取得
wdth = header[18] + header[19]*256; /* 画像の幅(width) */
hght = header[22] + header[23]*256; /* 画像の高さ(height) */
cm = header[28]/8; /* cm=1:mono, 3:color */
// カラーパレットの読み込み
if(cm==1){
for(j=0; j<1024; j++) pal[j] = fgetc(fp);
}
// 画素データの読み込み
pad = ((4-(wdth % 4))*cm) % 4; /* パディングデータのバイト数 */
for(j=0; j<hght; j++){ /* 画素データの取得 */
for(k=0; k<wdth; k++){
for(l=0; l<cm; l++) *(dat++) = fgetc(fp);
}
for(m=0; m<pad; m++)
dm = fgetc(fp); /* パディングデータのスキップ */
}
// BMPファイルのClose処理
fclose(fp);
// 画像サイズ,カラーモードをポインタ渡し
*color_mode = cm; *height = hght; *width = wdth;
}
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 22:56
by C6b14
まず この OpenGL は 私が 数日まえ OpenCV の 練習を した ところの ページ と似ているので( 画像も )そこを よんでみること。OpenCV 画像処理 で 検索 すればいいはず。 結構 似てるので もしかしたら ... 。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月21日(月) 23:04
by satoshi
C6b14 さんが書きました:まず この OpenGL は 私が 数日まえ OpenCV の 練習を した ところの ページ と似ているので( 画像も )そこを よんでみること。OpenCV 画像処理 で 検索 すればいいはず。 結構 似てるので もしかしたら ... 。
分かりました。 検索してみます!
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 00:11
by C6b14
プロジェクトの プロパティ で コマンドライン の 引数を 書く。構成ーー>Debugーーー->デバッグーー> コマンドライン引数を AAA と打って 実行。AAA と出るのを 確認。-説明しにくいので いまはここまで。 妙なところに こってるいるので わからなければ 後回し。今日はおしまい。
出来れば bmp の 名前 サイズ がわかる なら 書いて書いてください。(わからなければ 不要)
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 00:27
by C6b14
サイトはここです。
http://opencv.jp/cookbook/opencv_img.html。 サンプルが OpenCV で 全て動くし 画像処理 の例 がたくさんあるけど 「この プログラム」は すこし 複雑に書いてあるので 参考にならないかも です。写真はにてるけど。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 01:30
by satoshi
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 06:33
by hide
これは決まった課題なので難易度を下げるとかは難しそうです…
入門書が終わっていないようなレベルの本当の初心者だと、金曜までに仕上げるのはきついです。
1.の質問内容は画像処理以前の問題でこれを質問している段階だと結構厳しいと思われます。
期限が終わってから間に合いませんでした。と報告するようだと、間違いなくやる気がないと思われるので、
早い段階で言うべきだと言っています。(掲示板に質問するくらいなので最低限やる気はあるようですし。)
なので、実際に難易度を下げてもらえるかどうかとは別に、
まずは課題を出してもらう側としての常識として相談しないといけないです。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 08:47
by C6b14
まず 画像がでて menu の シミュレーション が出来るか 確認。 goto 文を 取る方法 は後で 考えるとして menu の仕組みを 理解すること。 この先が大変のようですし。
http://csi.nisinippon.com/g001.png
コード:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "c1.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) {/////////////////////////////////////////////////// 005<---
//
// 修正箇所① --- ここにコードを追加する
//
int num;
printf("===== フィルター処理 =====\n");
printf(" Menus\n");
printf(" 1.平滑 \n");
printf(" 2.鮮鋭 \n");
printf(" 3.ガウス\n");
printf(" 9. \n");
printf("==========================\n");
printf("Menu No.=");
scanf("%d", &num);
label:
switch (num) {
case 1:
//処理1
printf(" 1.平滑 ---実行\n");
break;
case 2:
//処理2
printf(" 2.鮮鋭 ---実行 \n");
break;
case 3:
//処理3
printf(" 3.ガウス ---実行\n");
break;
case 9:
exit(0);
break;
default:
//処理4
printf("違う! :Menu No.=");
scanf("%d", &num);
goto label;
break;
}
return 0;
}
// メイン関数
int main(int argc, char** argv) {
argc = 2; // 引数の数 ////////////////////////////////////////////////// 001 引数を上書き[引数シミュレーション ]
argv[1] = "d:\\img\\lenna.bmp";///////////////////////////////////////////// 002 (面倒なので作るときだけ
///////////////////////////////////////////////////////////////////////// 003 後で消せばよい)
// BMP画像の読み込み
if (argc<2) {
printf("画像ファイルを指定してください.\n");
exit(1);
}
///////////////////////////////////////////////////////////////////////// 004
printf("---BMPファイルのOpen処理---\n");
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()); printf("// 画像のフィルタ処理");/////////////// 005--->
// GLUTによる処理画像の表示
glut_ShowResults(argc, argv); printf("// GLUTによる処理画像の表示");//// 006 結果表示
return 0;
}
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 09:52
by C6b14
あ、ヘッダー ファイル名 を かえてる ので もとに 戻して ください。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 11:59
by C614b
プログラム的には 完成したので 分からないところを きいて ください。
http://csi.nisinippon.com/g002.png
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 17:42
by satoshi
コード:
argv[1] = "d:\\img\\lenna.bmp";///////////////////////////////////////////// 002 (面倒なので作るときだけ
///////////////////////////////////////////////////////////////////////// 003 後で消せばよい)
[/quote]
この 文の意味って言うのはこの女の人の画像を指定してあるってことですよね? 多分僕の書き方が悪かったかもしれないんですけど どの画像にも対応して表したかったんです…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 17:48
by satoshi
hide さんが書きました:
これは決まった課題なので難易度を下げるとかは難しそうです…
入門書が終わっていないようなレベルの本当の初心者だと、金曜までに仕上げるのはきついです。
1.の質問内容は画像処理以前の問題でこれを質問している段階だと結構厳しいと思われます。
期限が終わってから間に合いませんでした。と報告するようだと、間違いなくやる気がないと思われるので、
早い段階で言うべきだと言っています。(掲示板に質問するくらいなので最低限やる気はあるようですし。)
なので、実際に難易度を下げてもらえるかどうかとは別に、
まずは課題を出してもらう側としての常識として相談しないといけないです。
一応この課題は実験の一環なんですけど 他にもやってるひとがいて一応 条件は一緒なので相談は難しいです…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 17:54
by C6b14
ん? 画像 は なでも いいはず。 べつに 白黒でも いいし。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:13
by satoshi
C6b14 さんが書きました:ん? 画像 は なでも いいはず。 べつに 白黒でも いいし。
コード:
argv[1] = "d:\\img\\lenna.bmp";///////////////////////////////////////////// 002 (面倒なので作るときだけ
///////////////////////////////////////////////////////////////////////// 003 後で消せばよい)
この部分を入れるとどうしても表が出てこなくなるんです…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:25
by C6b14
文の 意味は 実際の 出来上がったときは ここの 部分の プログラムは いらないよ という意味です。 VisualStudio の使い方のぶぶんで あまり 使わない機能では あるので わからない ひとも 多いので パソコン と VS2015 とかバージョンを 教えてください。
適当なサイト を見ないと かなり 使っている ひとでも 説明が ながく なります。 とりあえず 使ってる環境によるので それが 分からないと むつかしい。( 取りあえず 画像 を 選べるようには プロがラム はなっている。たぶん この意味がわかるには ちょっと パソコンの知識がいります。) いまは 一番の ネック になると思うので わからないことは あまり 考えすぎずに聞いてください。
ここには詳しいひとがたくさんいて うまく 説明 して 頂けます。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:35
by C6b14
それと ここの ルール を見て パソコンの 使える程度とかわからないことは 説明しにくいですよ。(まず 画像のデータは 今まで使っていたものを フォルダーに 入れないといけない という事は 分かりませんか?)
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:38
by satoshi
C6b14 さんが書きました:文の 意味は 実際の 出来上がったときは ここの 部分の プログラムは いらないよ という意味です。 VisualStudio の使い方のぶぶんで あまり 使わない機能では あるので わからない ひとも 多いので パソコン と VS2015 とかバージョンを 教えてください。
適当なサイト を見ないと かなり 使っている ひとでも 説明が ながく なります。 とりあえず 使ってる環境によるので それが 分からないと むつかしい。( 取りあえず 画像 を 選べるようには プロがラム はなっている。たぶん この意味がわかるには ちょっと パソコンの知識がいります。) いまは 一番の ネック になると思うので わからないことは あまり 考えすぎずに聞いてください。
ここには詳しいひとがたくさんいて うまく 説明 して 頂けます。
Visual Studio2013 です パソコンは windows 8 です
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:41
by satoshi
C6b14 さんが書きました:それと ここの ルール を見て パソコンの 使える程度とかわからないことは 説明しにくいですよ。(まず 画像のデータは 今まで使っていたものを フォルダーに 入れないといけない という事は 分かりませんか?)
はい 多分分かります
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:50
by C6b14
まず どんな 画像をいれたか と なにか エラーメッセージ がでてないか?。( それと 環境の件 を教えてください。)
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 18:56
by C6b14
VS2013 の Debug の 方法 はわかると思うので エラー 情報とか 何かの メッセージ が でてないですか。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 19:00
by satoshi
C6b14 さんが書きました:まず どんな 画像をいれたか と なにか エラーメッセージ がでてないか?。( それと 環境の件 を教えてください。)
エラーは特になにも出てきませんでした
環境というのはどういうものですか?
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 19:13
by satoshi
C6b14 さんが書きました:VS2013 の Debug の 方法 はわかると思うので エラー 情報とか 何かの メッセージ が でてないですか。
最終的な結果としては ガウシアンフィルタによる平滑化画像と 鮮鋭化フィルタにによるエッジ強調画像を表示させたいんです…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 19:33
by C6b14
情報の行き違いです。(VS2013:Win8)。コマンドプロンプトで 使えるのなら main 関数 の 引数 で ファイルを 選べるんだから 001,002 をコメントアウト すればいいですよ。
それは 分かっているかど アルゴリズム までは作れないから プログラム全体を 早く作って 自力で作って。そちらは 専門だからすぐできるはず。( この レベル で作った例が ない。みな 簡単な OpenCV とか OpenGL の 命令だし。)
私もしりたいので
http://dixq.net/forum/viewtopic.php?f=3&t=18543に 前に作ったOpenGL の 画像描画 を見て考えて!
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 19:49
by C6b14
マスク値 の マトリクス部分はこれでいいのかな?。そちらの方は専門でしょうから 教えてほしい。
コード:
// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
//
// 修正箇所② --- ここにコードを追加する
//
printf("AAA101-------------->");
switch (menu_no) {
case 1:
//処理1
printf(" AAA1.平滑 ---実行\n");
msk[0][0] = 0; msk[0][1] = -1.0; msk[0][2] = 0;
msk[1][0] = 1.0; msk[1][1] = 5.0; msk[1][2] = -1.0;
msk[2][0] = 0; msk[2][1] = -1.0; msk[2][2] = 0;
//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0
//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
break;
case 2:
//処理2
printf(" 2.鮮鋭 ---実行 \n");
msk[0][0] = -1.0; msk[0][1] = -1.0; msk[0][2] = -1.0;
msk[1][0] = -1.0; msk[1][1] = -9.0; msk[1][2] = -1.0;
msk[2][0] = -0.0; msk[2][1] = -1.0; msk[2][2] = 0;
break;
case 3:
//処理3
printf(" 3.ガウス ---実行\n");
msk[0][0] = 1; msk[0][1] = 2.0; msk[0][2] = 1.0;
msk[1][0] = 2.0; msk[1][1] = 4.0; msk[1][2] = 2.0;
msk[2][0] = 1; msk[2][1] = 2.0; msk[2][2] = 1.0;
break;
}
}
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 19:56
by C6b14
マスク値 の マトリクス 部分 は これで いいのかな?。この辺は こちらがききたい。
コード:
// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
//
// 修正箇所② --- ここにコードを追加する
//
printf("AAA101-------------->");
switch (menu_no) {
case 1:
//処理1
printf(" AAA1.平滑 ---実行\n");
msk[0][0] = 0; msk[0][1] = -1.0; msk[0][2] = 0;
msk[1][0] = 1.0; msk[1][1] = 5.0; msk[1][2] = -1.0;
msk[2][0] = 0; msk[2][1] = -1.0; msk[2][2] = 0;
//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0
//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
break;
case 2:
//処理2
printf(" 2.鮮鋭 ---実行 \n");
msk[0][0] = -1.0; msk[0][1] = -1.0; msk[0][2] = -1.0;
msk[1][0] = -1.0; msk[1][1] = -9.0; msk[1][2] = -1.0;
msk[2][0] = -0.0; msk[2][1] = -1.0; msk[2][2] = 0;
break;
case 3:
//処理3
printf(" 3.ガウス ---実行\n");
msk[0][0] = 1; msk[0][1] = 2.0; msk[0][2] = 1.0;
msk[1][0] = 2.0; msk[1][1] = 4.0; msk[1][2] = 2.0;
msk[2][0] = 1; msk[2][1] = 2.0; msk[2][2] = 1.0;
break;
}
}
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 20:12
by C6b14
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 21:50
by satoshi
C6b14 さんが書きました:情報の行き違いです。(VS2013:Win8)。コマンドプロンプトで 使えるのなら main 関数 の 引数 で ファイルを 選べるんだから 001,002 をコメントアウト すればいいですよ。
それは 分かっているかど アルゴリズム までは作れないから プログラム全体を 早く作って 自力で作って。そちらは 専門だからすぐできるはず。( この レベル で作った例が ない。みな 簡単な OpenCV とか OpenGL の 命令だし。)
私もしりたいので
http://dixq.net/forum/viewtopic.php?f=3&t=18543に 前に作ったOpenGL の 画像描画 を見て考えて!
分かりました。頑張ってみます。 最後にちょっと質問なんですけど imfilterで番号を指定した後set_mask にガウシアンフィルタを処理するプログラムを書くらしいんですけどそのプログラムを実行させるプログラムの書き方って分かったりします? 分からなかったらいいんですけど…
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月22日(火) 22:20
by C6b14
( 返 不要)
コード:
// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
//
// 修正箇所② --- ここにコードを追加する
//
printf("AAA101-------------->");
switch (menu_no) {
case 1:
//処理1
printf(" AAA1.平滑 ---実行\n");
msk[0][0] = 0; msk[0][1] = -1.0; msk[0][2] = 0;
msk[1][0] = 1.0; msk[1][1] = 5.0; msk[1][2] = -1.0;
msk[2][0] = 0; msk[2][1] = -1.0; msk[2][2] = 0;
//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0
//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
break;
case 2:
//処理2
printf(" 2.鮮鋭 ---実行 \n");
msk[0][0] = -1.0; msk[0][1] = -1.0; msk[0][2] = -1.0;
msk[1][0] = -1.0; msk[1][1] = -9.0; msk[1][2] = -1.0;
msk[2][0] = -0.0; msk[2][1] = -1.0; msk[2][2] = 0;
break;
case 3:
//処理3
printf(" 3.ガウス ---実行\n");
msk[0][0] = 1; msk[0][1] = 2.0; msk[0][2] = 1.0;
msk[1][0] = 2.0; msk[1][1] = 4.0; msk[1][2] = 2.0;
msk[2][0] = 1; msk[2][1] = 2.0; msk[2][2] = 1.0;
break;
}
}
// 原画像datをフィルタ処理してresultに格納
void imfilter(int menu_no) { /////////////////////////////////////// 006
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] = dat[n];
}
else {
n = (x + width*y) * 3;
result[n] = dat[n];
result[n + 1] = dat[n];
result[n + 2] = dat[n];
}
///////////////////////////////////////////////////////////////////
// <修正箇所③ --- ここまで>
}
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) {/////////////////////////////////////////////////// 005<---
//
// 修正箇所① --- ここにコードを追加する
//
int num;
printf("===== フィルター処理 =====\n");
printf(" Menus\n");
printf(" 1.平滑 \n");
printf(" 2.鮮鋭 \n");
printf(" 3.ガウス\n");
printf(" 9. \n");
printf("==========================\n");
printf("Menu No.=");
scanf("%d", &num);
label:
switch (num) {
case 1:
//処理1
printf(" 1.平滑 ---実行\n");
imfilter(num); ///////////////////////////////////////////////////
break;
case 2:
//処理2
printf(" 2.鮮鋭 ---実行 \n");
imfilter(num); ///////////////////////////////////////////////////
break;
case 3:
//処理3
printf(" 3.ガウス ---実行\n");
imfilter(num); ///////////////////////////////////////////////////
break;
case 9:
exit(0);
break;
default:
//処理4
printf("違う! :Menu No.=");
scanf("%d", &num);
goto label;
break;
}
return 0;
}
// メイン関数
int main(int argc, char** argv) {
//argc = 2; // 引数の数 ////////////////////////////////////////////////// 001 引数を上書き[引数シミュレーション]
//argv[1] = "d:\\img\\lenna.bmp";////////////////////////////////////////// 002 (面倒なので作るときだけ
///////////////////////////
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月23日(水) 18:32
by satoshi
C6b14 さんが書きました:マスク値 の マトリクス 部分 は これで いいのかな?。この辺は こちらがききたい。
コード:
// フィルタの種類に応じて配列mskを初期化
void set_msk(int menu_no) { ///////////////////////////////////////// 101
//
// 修正箇所② --- ここにコードを追加する
//
printf("AAA101-------------->");
switch (menu_no) {
case 1:
//処理1
printf(" AAA1.平滑 ---実行\n");
msk[0][0] = 0; msk[0][1] = -1.0; msk[0][2] = 0;
msk[1][0] = 1.0; msk[1][1] = 5.0; msk[1][2] = -1.0;
msk[2][0] = 0; msk[2][1] = -1.0; msk[2][2] = 0;
//図3.6の4近傍は左から0、 - 1、0 - 1、5、 - 1 0、 - 1、0
//8近傍は - 1、 - 1、 - 1 - 1、9、 - 1 - 1、 - 1、 - 1
//図3.3のガウシアンフィルタのマスクは左から 1、2、1 2、4、2 1、2、1 です
break;
case 2:
//処理2
printf(" 2.鮮鋭 ---実行 \n");
msk[0][0] = -1.0; msk[0][1] = -1.0; msk[0][2] = -1.0;
msk[1][0] = -1.0; msk[1][1] = -9.0; msk[1][2] = -1.0;
msk[2][0] = -0.0; msk[2][1] = -1.0; msk[2][2] = 0;
break;
case 3:
//処理3
printf(" 3.ガウス ---実行\n");
msk[0][0] = 1; msk[0][1] = 2.0; msk[0][2] = 1.0;
msk[1][0] = 2.0; msk[1][1] = 4.0; msk[1][2] = 2.0;
msk[2][0] = 1; msk[2][1] = 2.0; msk[2][2] = 1.0;
break;
}
}
コード:
void set_msk(int menu_no){
int x=0, y=0 ,n=0;
double sum;
switch (menu_no){
case 1:
msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
break;
case 2:
n = x + width*y;
sum = 0.0;
sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
sum += msk[0][1] * dat[x + width*(y - 1)];
sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
sum += msk[1][0] * dat[(x - 1) + width* y];
sum += msk[1][1] * dat[x + width* y];
sum += msk[1][2] * dat[(x + 1) + width* y];
sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
sum += msk[2][1] * dat[x + width*(y + 1)];
sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
if (sum < 0) sum = 0.0;
else if (sum > 255) sum = 255.0;
result[n] = (unsigned char)sum;
break;
}
}
課題と一緒にもらった資料を見たら画像のようなプログラムが載っていたのでcase1 case2の時ともにこれであっていると思います。 でもなぜかこれではまだ左に処理後の表示されないんですけど あとちょっと頑張ってみます。 ありがとうございます。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月23日(水) 18:50
by C6b14
なーんだ。それがあれば もうできたようなものです。いまから ほんき で がんばればできると おもう。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 01:22
by satoshi
C6b14 さんが書きました:なーんだ。それがあれば もうできたようなものです。いまから ほんき で がんばればできると おもう。
なんか頑張って色々と調べてみたんですけど やっぱり色々試したんですけど処理されていない画像が右側に出てきてしまって… これプログラムが間違ってるんですかね? それともまだなにか マスク値に入れないといけないプログラムがあるんですかね?
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 08:12
by C6b14
とうぜん、そのままでは ロジックは くみこまれない のは わかるでしょう。 いま どういう 出力 なのか 画像 をみてみないと わからないので。 修正箇所② と 修正箇所③ にただしい ロジック いれないと (それは 専門 なので わかるはず )。
プログラムは さいしょ みたところ 1, 2, 3 ( 1.平滑 2.鮮鋭 3.ガウス ) が ひつようなのか どこまで せいじょうなのか ひじょうに あやふやに みえるので。[ なんにも できて なかった : それは気になったし 他のかたもしてきされたし]
まず 出力画像 と プログラム を見せて。 (case ぶん のかず も あわないし やること がみえないから )
かんたんに フローチャート ( かんたん らくがき レベル でいい )をのせてください。それと やはり 環境 がきにはなる。( VS2013 の Debug の を どのように つかって いるのか または Release を使って いるのか )ここの ルール や
http://dixq.net/forum/viewtopic.php?f=3&t=18583のように書かないと。ルールで まるなげはきんしだし。 まあ わたしもしりたいことなので かんがえて みたいの で まず そちらの ベクトル と こちらの ベクトル がずれてるので ちがう ほうこうに いく から。(そちらは わかることでも こちらには 説明がないと 。 画像処理の原理なんて まったく しりません )
まず ルール。それから 現状を知らせてほしい。 (わからいこと が わからないので しつもん をしぼって )。こちらもわかりやすくかきかえるから。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 09:32
by C6b14
* [F11] で 「変数の 変化を おいかけること」が できるのか どうか を ルールに に則って 書いてください。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 10:26
by sky
1.filter_menuの部分を 表示されたメニュー以外の番号指定した場合はコンソールで再度Menu番号の入力を促して、9を入力した場合は、処理を行わずプログラムを終了するというプログラムがどんなものかよく分かりません(どんなものかは添付のフィルタ処理プログラムの文字が入ってるもの)
2.Menu番号1が入力されたときガウシアンフィルタによる平滑化を実行して処理画像の右側に表示する(添付してある写真の何も写ってない方に)ガウシアンフィルタのマスク値(図3.3)にセットしてset_maskにコードを追加してガウシアンフィルタによる平滑化の値を計算してresultに格納するようimfilterを修正したプログラムが考えても分かりません
3.Menu番号2が入力されたとき鮮鋭化フィルタによるエッジ強調を実行し処理画像の右側に表示する。図3.6に示す鮮鋭化フィルタのマスク値にセットするようset_maskにコードを追加して画素毎に鮮鋭化フィルタによるエッジ強調出力の値を計算してresultに格納するようimfilterを修正したプログラムが分かりません
先週の金曜から毎日色々なサイトを見て考えているんですけど どうしてもわからなくて
c言語の基礎はわかっていますか?基本的なことが分かっている人でないならこんな問題考えないですよね、
一つ提案がコメントを山ほど1行に一つずつ入れてみることです、そうすると自分がどの項目が理解できてないのか
わかるでしょう、つまりなんでも呑み込むことです、間違っててもいいコメントを入れて投稿してください
そうすると「ここはまちがってますよ」と指摘がありますから、それから修正すればいい。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 15:25
by C6b14
あれだけの 資料があれば もしかして、もうできた?。
もし まだなら 投稿のかたのいわれる とうり コメントいり プログラム をなげて もらえば いろいろ ヒント を もらえると 思います。プログラム の 問題 だけの よう なので。( C では あまり かかないので 詳し人からの ヒントで わかるはず )。 ひとつ まえの 私の投稿は 無視して ください。( それと別スレ[再質問] に してもらえば )
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 17:51
by C6b14
さいごの資料で ロジック をくめば 平滑化(ガウシアン) される みたい。

Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 19:00
by C6b14
とりあえず (いるのなら)いまの コードを 送ってもらえば いいですよ。 わかってしまえば かんたん だし わからないときは すごく 難しく みえるから。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 20:56
by C6b14
はやい はなし Matrix 設定部分 と dat 平滑化部分 に分割しないと ...
コード:
switch (menu_no) {
case 1:
msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
break;
(白黒画像 部分)
double sum;// 宣言に追加する
コード:
// <修正箇所③ --- ここから>
// <以下はすべての画素に128を入れるダミーコード>
///////////////////////////////////////////////////////////////////
if (cm == 1) {
n = x + width*y;
sum = 0.0;
sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
sum += msk[0][1] * dat[x + width*(y - 1)];
sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
sum += msk[1][0] * dat[(x - 1) + width* y];
sum += msk[1][1] * dat[x + width* y];
sum += msk[1][2] * dat[(x + 1) + width* y];
sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
sum += msk[2][1] * dat[x + width*(y + 1)];
sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
if (sum < 0) sum = 0.0;
else if (sum > 255) sum = 255.0;
result[n] = (unsigned char)sum;
// result[n] = dat[n];
}
else {
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 23:22
by satoshi
C6b14 さんが書きました:はやい はなし Matrix 設定部分 と dat 平滑化部分 に分割しないと ...
コード:
switch (menu_no) {
case 1:
msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
break;
(白黒画像 部分)
double sum;// 宣言に追加する
コード:
if (cm == 1) {
n = x + width*y;
sum = 0.0;
sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
sum += msk[0][1] * dat[x + width*(y - 1)];
sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
sum += msk[1][0] * dat[(x - 1) + width* y];
sum += msk[1][1] * dat[x + width* y];
sum += msk[1][2] * dat[(x + 1) + width* y];
sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
sum += msk[2][1] * dat[x + width*(y + 1)];
sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
if (sum < 0) sum = 0.0;
else if (sum > 255) sum = 255.0;
result[n] = (unsigned char)sum;
// result[n] = dat[n];
}
else {
コード:
void set_msk(int menu_no){
int x=0, y=0 ,n=0;
double sum;
switch (menu_no){
case 1:
msk[0][0] = 1 / 16.0; msk[0][1] = 2 / 16.0; msk[0][2] = 1 / 16.0;
msk[1][0] = 2 / 16.0; msk[1][1] = 4 / 16.0; msk[1][2] = 2 / 16.0;
msk[2][0] = 1 / 16.0; msk[2][1] = 2 / 16.0; msk[2][2] = 1 / 16.0;
break;
case 2:
msk[0][0] = 0.0; msk[0][1] = -1.0; msk[0][2] = 0.0;
msk[1][0] = -1.0; msk[1][1] = 5.0; msk[1][2] = -1.0;
msk[2][0] = -0.0; msk[2][1] = -1.0; msk[2][2] = 0;
break;
}
}
// 原画像datをフィルタ処理してresultに格納
void imfilter(int menu_no){
int x, y, n;
double sum;
// フィルタマスクの初期化
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){
if(cm==1){
n = x + width*y;
sum = 0.0;
sum += msk[0][0] * dat[(x - 1) + width*(y - 1)];
sum += msk[0][1] * dat[x + width*(y - 1)];
sum += msk[0][2] * dat[(x + 1) + width*(y - 1)];
sum += msk[1][0] * dat[(x - 1) + width* y];
sum += msk[1][1] * dat[x + width* y];
sum += msk[1][2] * dat[(x + 1) + width* y];
sum += msk[2][0] * dat[(x - 1) + width*(y + 1)];
sum += msk[2][1] * dat[x + width*(y + 1)];
sum += msk[2][2] * dat[(x + 1) + width*(y + 1)];
if (sum < 0) sum = 0.0;
else if (sum > 255) sum = 255.0;
result[n] = (unsigned char)sum;
}
else{
n = (x+width*y)*3;
result[n] = dat[n];
result[n+1] =dat[n+1];
result[n+2] =dat[n+2];
}
}
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];
}
}
}
}
}
このコードを書いたら実行結果でこうでました おそらくこれで正解だと思います! ほんとにありがとうございました… あと後々のことを考えて質問がしたくて 環境はどういったものですか?って質問なんですけど 環境がよく分かんなくて例えばどういったものなんですか?
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月24日(木) 23:51
by C6b14
[環境] とは パソコン環境 の省略形 で つまり パソコンの機種 とか 型 OS , VisualStudio2013 、 使っている付属品 などで 質問に 関係 する ハード と ソフト のことです。
「とくに 映像 関係 は 機材に 依存する ことが あるので」 答えが ちがう からです。
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月25日(金) 00:05
by C6b14
コード:
void set_msk(int menu_no){
int x=0, y=0 ,n=0;
double sum;
switch (menu_no){
の
int x=0, y=0 ,n=0;
double sum;
は いらない。
[あとで けす つもり だと 思うけど 念のため]
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月25日(金) 00:06
by とおりんすがりん
通りすがりですがその使ってる画像とプログラムから大体特定しますた
忠告しとくとあんまりこういうとこで聞くもんじゃないですよ
Re: 初心者なのでまったく分かりませんでした…
Posted: 2016年11月25日(金) 00:25
by C6b14
それは そう思いますよね。まあ これから こういう質問には 答えられないですよ。 もっと 一般的な 質問なら いいけれども。