图像线性变换
程序员文章站
2023-12-25 23:11:39
...
图像线性变换,像素值计算公式:y=a*x+b
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ch3_1 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BufferedImage bi=ImageIO.read(new File("1.jpg")); //读取图像
BufferedImage nbi=xianxing(bi,1.5,-50); //处理图像
ImageIO.write(nbi, "jpg", new File("1b.jpg")); //输出图像
System.out.println("程序结束!");
}
/**
* 图像线性变换
* @param BufferedImage bi 原始图像
* @param double aa 变换系数
* @param int bb 亮度系数
* @return BufferedImage 变换后图像
* */
public static BufferedImage xianxing(BufferedImage bi,double aa,int bb) {
int w=bi.getWidth(); //得到图像的宽度
int h=bi.getHeight(); //得到图像的高度
BufferedImage nbi=new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); //创建新图像(临时图像变量)
//循环遍历每一个像素点
for(int y=0;y<h;y++) {
for(int x=0;x<w;x++) {
//本次实验的重点内容
int pixel=bi.getRGB(x, y); //得到坐标为(x,y)处的像素值
Color c=new Color(pixel); //转换为Color类,便于处理
int r=xianxing(c.getRed(),aa,bb); //红色通道
int g=xianxing(c.getGreen(),aa,bb); //绿色通道
int b=xianxing(c.getBlue(),aa,bb); //蓝色通道
Color nc=new Color(r,g,b); //根据红绿蓝三个通道,合成新颜色
int rgb=nc.getRGB(); //转换为int类型
nbi.setRGB(x, y, rgb); //设置输出图像坐标为(x,y)的像素值
}
}
return nbi;
}
/**
* 像素线性变换
* */
private static int xianxing(int pix, double aa, int bb) {
int y=(int)(aa*pix+bb);
if(y>255) y=255;
if(y<0) y=0;
return y;
}
}