はじめまして。プログラミング課題でグレースケール画像の誤差拡散法を用いた二値化をプログラミングしています。
しかし、書いてあるとおりにプログラミングしても真っ白になってしまいます。どうしてでしょうか?
主なソースコードは
対象画素の画素値: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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 画像の画素値を変えるC言語のプログラムで指定された画像の中に白い三角形を右上に表示させるにはどのよう 3 2022/10/30 01:16
- 物理学 移流熱拡散方程式の解き方 フーリエ変換 1 2022/08/15 15:25
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- その他(プログラミング・Web制作) 大学一年でVBAのプログラミングを勉強しているものです。来週の情報の授業で以下の問題のプログラムを勉 4 2023/01/19 16:15
- 格安スマホ・SIMフリースマホ 端末設定画面とアプリのデータ使用量の誤差について 4 2023/04/12 18:02
- 統計学 統計学を独学で勉強してます。 ページ左上に誤差分散の推定量の指揮があると思いますが(青いペン) 例題 2 2023/02/12 12:34
- 統計学 統計学を独学で勉強してます。 ページ左上に誤差分散の推定量の指揮があると思いますが(青いペン) 例題 5 2023/02/12 15:39
- その他(プログラミング・Web制作) パイソンのプログラミングについての質問です 2 2023/05/22 12:39
- その他(プログラミング・Web制作) プログラミングを使ったYoutubeでの自動化について 3 2023/03/02 22:39
- 統計学 信頼区間についての質問です。 6 2023/06/25 17:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Studio Codeについて
-
エクセルVBAでRS232Cへ
-
作業工程 SDとMD
-
MFCとC++/CLIとの比較
-
procってなんですか?
-
スクリーンセイバーの作り方
-
アセンブリ名とは??
-
USBカメラからDirectShowを使っ...
-
PHPやJavaで料金シュミレーショ...
-
プログラミング経験が何もない...
-
最近小学生、中学生にもプログ...
-
私はプログラミングは一切分か...
-
宣言の構文エラーが出ます。
-
Fortranのフリーソフトってあり...
-
オススメのプログラミングスク...
-
scanf_s 使い方 cc言語
-
義務教育レベルのプログラミン...
-
誤差拡散法のプログラミング
-
以下のサイトのようなフォーム...
-
PL/Iについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
家庭のパソコンで Python の 環...
-
プログラミングの雑談とかでき...
-
以下のサイトのようなフォーム...
-
LeetCodeていうの初めて、
-
IT業界より楽に稼げる業界って...
-
アセンブリ名とは??
-
プログラミングをやってます。 ...
-
procってなんですか?
-
CSVデータの"(ダブルクォーテ...
-
VBA フォルダ アクセス権限付与
-
GitHubについて
-
実はこれからの時代はプログラ...
-
Try Kotlinで readLine()を使う...
-
【Chapter2】プログラミング教...
-
Visual Studio Codeについて
-
コンピュータのプログラミング...
-
PL/Iについて
-
VBAプログラミング
-
最近小学生、中学生にもプログ...
-
MFCとC++/CLIとの比較
おすすめ情報