在數字圖像處理中,圖像去噪是一個非常重要的問題。去除噪聲可以使圖像更加清晰,提高其質量。Java提供了很多圖像去噪算法,其中最常見的是中值濾波算法。
中值濾波算法是一種全局非線性濾波算法,它可以取代某些線性濾波算法,并且在處理圖像噪聲時表現良好。中值濾波的基本思想是在圖像上滑動一個窗口,并用窗口內像素的中值來代替當前像素的數值,從而減少圖像中的噪聲。
public BufferedImage medianFilter(BufferedImage sourceImage, int kernelSize) { // Get image dimension int width = sourceImage.getWidth(); int height = sourceImage.getHeight(); // Create new image object BufferedImage destImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); int halfKernelSize = kernelSize / 2; int[] filterArray = new int[kernelSize * kernelSize]; // Loop through image pixels for (int x = 0; x< width; x++) { for (int y = 0; y< height; y++) { int arrayIndex = 0; // Loop through filter for (int xx = x - halfKernelSize; xx<= x + halfKernelSize; xx++) { for (int yy = y - halfKernelSize; yy<= y + halfKernelSize; yy++) { if (xx >= 0 && xx< width && yy >= 0 && yy< height) { filterArray[arrayIndex++] = sourceImage.getRGB(xx, yy) & 0xff; } } } // Sort filterArray Arrays.sort(filterArray); // Set median pixel value int medianValue = filterArray[arrayIndex / 2]; destImage.setRGB(x, y, (medianValue<< 16) | (medianValue<< 8) | medianValue); } } return destImage; }
上述代碼實現了一個中值濾波的算法。它接受一個源圖像以及濾波器大小作為參數,并返回一個處理過的圖像。由于Java中的圖像是以RGB值表示的,因此我們需要將圖像轉換為灰度圖像并處理。該算法首先循環遍歷圖像中的所有像素,然后對每個像素進行中值濾波處理。算法通過滑動一個窗口取出當前像素周圍的所有像素,并用中值代替當前像素的值。最后,該算法返回一個處理后的圖像。