JavaのMedian filter imageについて
現在javaでMedian filterを使って画像のノイズを除去するプログラムを書いています。そのやり方として、真ん中とその周辺を含めた9つのピクセルから、5番目に大きい値を真ん中に出力するというのは理解しています。しかしint iRd
、int iBd
、int iGd
それぞれの5番目の値をfor文を使って回すのか、それともsortを使ってそこから5番目の値を抽出すればいいのか、またそのやり方がわかりません。教えていただけると幸いです。
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
//The class for carrying out the filtering
public class ImgFil{
// Median filter
public Image filMedian(Image image) {
// indice for expressing the x,y differences from the center
int[] iDx = { -1, 0, 1, -1, 0, 1, -1, 0, 1 };
int[] iDy = { -1, -1, -1, 0, 0, 0, 1, 1, 1 };
// Getting the pixel array of the original image 3
ImageData imd = image.getImageData();
// Setting the pixel array for the new result image
ImageData imd2 =image.getImageData();
for (int y = 1; y < (imd.height-1); y++) {
for (int x = 1; x < (imd.width-1); x++) {
int iRsum = 0;
int iGsum = 0;
int iBsum = 0;
for (int i = 0; i < 9; i++) {
int iC = imd.getPixel(x+iDx[i], y+iDy[i]);
int iR = iC & 0x00ff;
int iG = (iC >> 8) & 0x00ff;
int iB = (iC >> 16) & 0x00ff;
// Adding the RGB values of pixels in the eight neighborhood repeatedly
iRsum += iR;
iGsum += iG;
iBsum += iB;
}
// Getting 5th large number
int iRd = iRsum;
int iGd = iGsum;
int iBd = iBsum;
int iCd = (iBd << 16) + (iGd << 8) + iRd;
imd2.setPixel(x, y, iCd);
}
}
Image newImage = new Image(null, imd2);
return newImage;
}
}