Java实现使用线性(或分段线性)灰度变换进行图像对比度拉伸, 线性变换步骤如下: a)求出输入图像的最小和最大像素值[fmin,fmax]; b)利用线性变换y=af+b将像素值范围由[fmin,fmax]变为[0,255]; 其中:a=255/(fmax-fmin);b=-fmin*255/(fmax-fmin) )
时间: 2024-02-21 10:59:43 浏览: 86
以下是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 ContrastStretching {
public static void main(String[] args) {
try {
// 读取图像文件
BufferedImage inputImage = ImageIO.read(new File("input.jpg"));
// 获取图像的宽和高
int width = inputImage.getWidth();
int height = inputImage.getHeight();
// 求出输入图像的最小和最大像素值[fmin,fmax]
int fmin = 255, fmax = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
Color color = new Color(inputImage.getRGB(x, y));
int gray = color.getRed(); // 这里假设图像是灰度图
if (gray < fmin) {
fmin = gray;
}
if (gray > fmax) {
fmax = gray;
}
}
}
// 利用线性变换y=af+b将像素值范围由[fmin,fmax]变为[0,255]
double a = 255.0 / (fmax - fmin);
double b = -fmin * 255.0 / (fmax - fmin);
BufferedImage outputImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
Color color = new Color(inputImage.getRGB(x, y));
int gray = color.getRed(); // 这里假设图像是灰度图
int newGray = (int) (a * gray + b);
newGray = Math.max(0, Math.min(newGray, 255)); // 确保像素值在[0, 255]范围内
Color newColor = new Color(newGray, newGray, newGray);
outputImage.setRGB(x, y, newColor.getRGB());
}
}
// 保存输出图像文件
File outputfile = new File("output.jpg");
ImageIO.write(outputImage, "jpg", outputfile);
System.out.println("图像对比度拉伸完成!");
} catch (IOException e) {
System.out.println("读取或保存图像文件出错:" + e.getMessage());
}
}
}
```
在这个示例中,我们首先读取输入图像文件。然后,我们遍历图像中的每个像素,求出输入图像的最小和最大像素值[fmin,fmax]。接下来,我们利用线性变换y=af+b将像素值范围由[fmin,fmax]变为[0,255]。最后,我们将结果保存到输出图像文件中。
阅读全文