java实现中值滤波(附完整源码)
时间: 2023-11-09 09:05:34 浏览: 121
以下是Java实现中值滤波的完整源码,包括注释说明:
```java
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class MedianFilter {
public static void main(String[] args) throws IOException {
// 读取输入的图像文件
BufferedImage image = ImageIO.read(new File("input.jpg"));
// 图像的宽度和高度
int width = image.getWidth();
int height = image.getHeight();
// 创建一个新的图像,用于存储中值滤波后的结果
BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 使用3x3的卷积核进行中值滤波
int[] pixels = new int[9];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int index = 0;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
int offsetX = x + i;
int offsetY = y + j;
if (offsetX >= 0 && offsetX < width && offsetY >= 0 && offsetY < height) {
// 获取卷积核中的像素值
pixels[index++] = image.getRGB(offsetX, offsetY);
}
}
}
// 对像素值进行排序,取中间的值作为中值
int median = getMedian(pixels);
// 将中值赋值给新的图像
result.setRGB(x, y, median);
}
}
// 将中值滤波后的图像保存到文件
ImageIO.write(result, "jpg", new File("output.jpg"));
}
/**
* 对像素值进行排序,取中间的值作为中值
* @param pixels 像素值数组
* @return 中值
*/
private static int getMedian(int[] pixels) {
int size = pixels.length;
for (int i = 1; i < size; i++) {
for (int j = 0; j < size - i; j++) {
if (pixels[j] > pixels[j + 1]) {
int temp = pixels[j];
pixels[j] = pixels[j + 1];
pixels[j + 1] = temp;
}
}
}
return pixels[size / 2];
}
}
```
在上面的代码中,我们使用3x3的卷积核进行中值滤波。对于每个像素,我们获取以该像素为中心的3x3的区域内的所有像素,并将它们存储在一个数组中。然后,我们对该数组进行排序,取中间的值作为中值,并将中值赋值给新的图像。
最后,我们将中值滤波后的图像保存到文件中。注意,这里我们使用了Java内置的图像处理类库javax.imageio.ImageIO,它支持多种图像格式,包括JPEG、PNG、GIF等。
阅读全文