图像开窗变换
像素值计算公式(部分):y=255*(x-cw+ww/2)/ww cw:窗位;ww:窗宽
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ch3_2 {
public static void main(String[] args) throws Exception {
BufferedImage bi=ImageIO.read(new File("1.jpg")); //读取图像
BufferedImage nbi=kaichuang(bi,127,100); //处理图像
ImageIO.write(nbi, "jpg", new File("1b.jpg")); //输出图像
System.out.println("程序结束!"); //程序结束后进行提示
}
/**
* 图像开窗变换
* @param BufferedImage bi 原始图像
* @param int cw 窗位
* @param int ww 窗宽
* @return BufferedImage 变换后图像
* */
public static BufferedImage kaichuang(BufferedImage bi, int cw, int ww) {
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类,便于处理
//和实验1不同的地方,调用自己编写的方法,处理像素值
int r=kaichuang(c.getRed(),cw,ww); //红色通道
int g=kaichuang(c.getGreen(),cw,ww); //绿色通道
int b=kaichuang(c.getBlue(),cw,ww); //蓝色通道
Color nc=new Color(r,g,b); //根据红绿蓝三个通道,合成新颜色
int rgb=nc.getRGB(); //转换为int类型
nbi.setRGB(x, y, rgb); //设置输出图像坐标为(x,y)的像素值
}
}
return nbi;
}
/**
* 像素开窗变换
* */
private static int kaichuang(int pix, int cw, int ww) {
int y =255*(pix-cw+ww/2)/ww;
if(y<0)y=0;
if(y>255)y=255;
return y;
}
}