Sobelフィルタがうまく作れません…
プログラミング初心者で、プログラミングが苦手な者です。
エクリプスというソフトを使ってJavaでsobelフィルタの画像処理を作っているのですが
どうしても出来ない部分があります。
下記のコードで作っているのですがうまく動作が出来ないようです。
import org.eclipse.swt.graphics.*;
// フィルタクラス
public class ImgFil{
// Sobelフィルタ
public static Image filso(Image image) {
int[] iDx = {- 1, 0, -1, -1, 0, 1, -1, 0, 1 };
int[] iDy = { -1, -1, -1, 0, 0, 0, 1, 1, 1 };
int[] iW1 = { -1, 0, 1, -2, 0, 2, -1, 0, 1 };
int[] iW2 = { -1, -2, -1, 0, 0, 0, 1, 2, 1 };
ImageData imd = image.getImageData(); // 画像データ
ImageData imd2 =image.getImageData(); // 変換後データを格納するImageData
// 画像の幅、高さ
int wid = imd.width;
int hgt = imd.height;
// 空間フィルタは周りの画素を使うため、
// はみでないように(1~wid-1)と(1~hgt-1)でループ
for (int y = 1; y < hgt-1; y++) {
for (int x = 1; x < wid-1; x++) {
for(int i = 0; i < 9; i++) {
// 中心座標の色
int iC0 = imd.getPixel(x, y);
int iR0 = PixelColor.getR(iC0);
int iG0 = PixelColor.getG(iC0);
int iB0 = PixelColor.getB(iC0);
// 右どなりの色
int iCr = imd.getPixel(x+1, y);
int iRr = PixelColor.getR(iCr);
int iGr = PixelColor.getG(iCr);
int iBr = PixelColor.getB(iCr);
// 下どなりの色
int iCu = imd.getPixel(x, y+1);
int iRu = PixelColor.getR(iCu);
int iGu = PixelColor.getG(iCu);
int iBu = PixelColor.getB(iCu);
// 合計値を加算していく変数
int iRsum1 = 0;
int iGsum1 = 0;
int iBsum1 = 0;
int iRsum2 = 0;
int iGsum2 = 0;
int iBsum2 = 0;
// RGBに分解して取得
int iR = PixelColor.getR(iC);
int iG = PixelColor.getG(iC);
int iB = PixelColor.getB(iC);
// 累積加算1
int iRsum + = iR * iW1[i];
int iGsum + = iG * iW1[i];
int iBsum + = iB * iW1[i];
// 累積加算2
int iRsum + = iR * iW2[i];
int iGsum + = iG * iW2[i];
int iBsum + = iB * iW2[i];
}
// エッジ強度を計算
// Math.abs(...)は絶対値を求める関数
int iRd = Math.abs(iRr-iRO) + Math.abs(iRu-iR0);
int iGd = Math.abs(iGr-iG0) + Math.abs(iGu-iG0);
int iBd = Math.abs(iBr-iB0) + Math.abs(iBu-iB0);
int iRd2 = Math.abs(iRr-iR0) + Math.abs(iRu-iR0);
int iGd2 = Math.abs(iGr-iG0) + Math.abs(iGu-iG0);
int iBd2 = Math.abs(iBr-iB0) + Math.abs(iBu-iB0);
// 合計値を個数で割る
int iPRd = iRd+iRd2 ;
int iPGd = iRd+iRd2 ;
int iPBd = iRd+iRd2 ;
// 上限値のチェック
// (255を超すとエラーになるので255に揃える)
if (iPRd > 255){
iRd = 255;
}
if (iPGd > 255){
iPGd = 255;
}
if (iPBd > 255){
iPBd = 255;
}
// 下限値のチェック
// (255を超すとエラーになるので255に揃える)
if (iPRd < 0){
iPRd = 0;
}
if (iPGd < 0){
iPGd = 0;
}
if (iPBd < 0){
iPBd = 0;
}
// カラー値の作成
int iCd = PixelColor.setRGB(iRd, iGd, iBd);
// カラー値をimd2(変換後データ)に設定
imd2.setPixel(x, y, iCd);
}
}
// 変換後データimd2を使って、新しいImageを作成
Image newImage = new Image(null, imd2);
// 新しいImageを返す
return newImage;
}
}
エクリプスで見るとRGBに分解して取得、累積加算、
エッジ強度の計算のところのコードに
赤波線のエラー表示が出ていたので
その部分の処理がうまく出来ていないのではと思います。
sobelプログラムを動作させるためのファイルは全部で4つで
一つは画像を呼び出すボタンファイル。
二つ目に画像処理を起動するファイル。
三つ目に画像表示用のファイル。
RGBの値を取得するファイル。
で構成されています。
今回問題があって質問したいのは
二つ目の画像処理を起動するファイルのコードです。
自分でもインターネット等で似たような構成のソースコードを
参考にしてやってみたのですが良く分かりませんでした。
プログラミングが苦手なので
出来る限り分かりやすく解答していただけれると助かります。
お礼
非常にわかりやすい説明でした。 ありがとうございました。