はじめまして。プログラミング課題でグレースケール画像の誤差拡散法を用いた二値化をプログラミングしています。
しかし、書いてあるとおりにプログラミングしても真っ白になってしまいます。どうしてでしょうか?
主なソースコードは
対象画素の画素値:f
誤差:e
-----------------------------------------
for(i = 0 ; i < wide ; i++){
for(j = 0 ; j < high ; j++){
e = f[i][j] - 255;
if(f[i][j] > 127)
f[i][j] = 255;
else
f[i][j] = 0;
f[i+1] += 5/16*e;
f[i+1][j+1] += 3/16*e;
f[i][j+1] += 5/16*e;
}
}
-----------------------------------
というとても簡素な構造になっています。右端とか下とかの場合分けは今省略させてもらいました。
私の考察としてどんどん誤差が累積されるので真っ白になってもおかしくないと思うのですが。教科書やネットページを見てもこのようになっている感じがします。どこがおかしいのか教えてください。よろしくお願いします。
No.4ベストアンサー
- 回答日時:
#3です。
アルゴリズム間違ってませんか?
【二値化 誤差拡散法】で検索かけたら
「Floyd & Steinberg型」と「Javis,Judice,& Ninke型」というのが見つかりました。
そこのサンプルと比較すると、
・誤差の計算方法
・誤差の分散方法
が提示したソースと異なっているようです。
No.3
- 回答日時:
画像処理の手法については知識が無いのですが
提示されたソースを見て。
f[i+1] += 5/16*e;
のところだけ1次元配列になっていますが
これは転記ミスでしょうか?
No.2
- 回答日時:
このままだと正確な判断ができませんので、
1.使用している変数の型をすべて提示してください。
2.使用しているOS及びコンパイラを提示してください。
3.念のため確認しますが、このソースは、実際のプログラムのソースをコピーして、張りつけたものでしょうか。(手で入力して転記ミスはないですね)
上記の補足をお願いします。
この回答への補足
OSはLinuxのRedHutです(つづり間違ってたらすいません)
コンパイラはわかりませんがmakeを使いました。
無知で申し訳ないです。
補足します。実際のソースコードは以下のとおりです。
いろいろ関数使ってるんですけど
// 入力データ(piInputmData)を誤差拡散方を用いて二値化して、
// 出力データ(piOutputData)に保存
のところから誤差拡散法に入ります。
問題は一次元配列になっているところです。理由はわかりませんが位置次元でやれとのことなので・・・。
void Error_diffusion_method(void){
int iWidth, iHeight, iMaxValue; // 画像の幅,高さ,解像度
int * piInputData; // 入力データの格納
int * piOutputData; // 画像処理したデータを格納
int e; // 誤差を格納
int i; // ループカウンタ
// 二値画像
printf("\n**** Error diffusin method Image *****\n");
// PGM形式の入力データの読み込み
piInputData = ReadPgm(&iWidth, &iHeight, &iMaxValue);
// 出力データ(1次元)のメモリ領域の確保
// piOutputData[iWidth*iHeight]
piOutputData = (int *)malloc(iWidth*iHeight*sizeof(int));
// 入力データ(piInputmData)を誤差拡散方を用いて二値化して、
// 出力データ(piOutputData)に保存
for(i = 0; i < iWidth*iHeight; i++){
e = 255 - piInputData[i];
//拡散処理前の対象画素処理
if(piInputData[i] <= 127){
piInputData[i] = 0;
}
else{
piInputData[i] = 255;
}
piOutputData[i] = piInputData[i];
//誤差拡散処理
//1.最後の画素の時
if(i == (iWidth*iHeight-1)){
}
//2.最下行の時
else if(i >= (iWidth*iHeight - iWidth)){
piInputData[i+1] += e*3/16;
}
//3.右端の時
else if(((i+1) % iWidth) == 0){
piInputData[i+iWidth] += e*3/16;
}
//4.通常状態
else{
piInputData[i+1] += e*3/16;
piInputData[i+iWidth] += e*3/16;
piInputData[i+iWidth+1] += e*5/16;
}
}
// 入力データを保存しているメモリ領域を解放
FreePgm(piInputData);
// PPM形式のファイルに出力データを出力
WritePgm(piOutputData, iWidth, iHeight, iMaxValue);
// 出力データを保存しているメモリ領域を解放
FreePgm(piOutputData);
}
となっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アセンブリ名とは??
-
Visual Studio Codeについて
-
リピート再生が出来ません
-
乱数について
-
C++で表示したグラフをbmpやjpg...
-
VBAプログラミング
-
Arduinoのシリアル入力について
-
MSCommで、文字化け
-
大学のプログラミングの授業で...
-
プログラミングを始めようと思...
-
今日、小論文を書きました。「2...
-
RDS…白黒のノイズ画像が作りたい
-
プログラミング教室に入ったら...
-
曲げセンサー
-
子どもの習い事にプログラミン...
-
VB.NETのコンボボックスについて
-
プログラミングに関連する質問
-
CSVデータの"(ダブルクォーテ...
-
C言語でのプログラミング
-
大学の建築学部ってプログラミ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Visual Studio Codeについて
-
アセンブリ名とは??
-
exeファイルを作ったり改造した...
-
趣味レベルでプログラミングを...
-
CSVデータの"(ダブルクォーテ...
-
procってなんですか?
-
作業工程 SDとMD
-
push any key で終了する方法?
-
VBAプログラミング
-
リピート再生が出来ません
-
プログラミングの雑談がしたい...
-
曲を作るのにプログラミングっ...
-
Python で筆算のプログラミング...
-
VBA フォルダ アクセス権限付与
-
プログラミングの質問です。x^2...
-
VB 1対1の簡単なチャットプログ...
-
MFCとC++/CLIとの比較
-
Try Kotlinで readLine()を使う...
-
VBでアナログ時計を作りたい
-
小学1年生の子です。塾に行かせ...
おすすめ情報