java 灰度直方图_java实现图像的直方图均衡以及灰度线性变化,灰度拉伸

1 importjava.awt.Image;2 importjava.awt.image.BufferedImage;3 importjava.awt.image.PixelGrabber;4 importjava.io.File;5 importjava.io.IOException;6 importjava.util.Iterator;7 importjava.util.Scanner;8

9 importjavax.imageio.ImageIO;10 importjavax.imageio.ImageReader;11 importjavax.imageio.stream.ImageInputStream;12 importjavax.swing.filechooser.FileNameExtensionFilter;13

14

15 public classImageProcessing {16

17 /**

18 *@paramargs19 */

20

21 staticImage tmp;22 static int iwidth,iheight;//图像宽度,高度

23 static double ma,mi;//线性变化灰度上下限

24 static int[] pixels;//图像所有像素点

25 static int[] pixels2;//备份pixels,用于灰度线性变化

26 static int[] pixels3;//备份pixels,用于灰度拉伸

27 static int[] histogram=new int[256];28 static String filename=null,directory=null,fileFormat=null;//要变换的图像路径名+文件名

29 public static void main(String[] args) throwsIOException, InterruptedException {30 //TODO Auto-generated method stub

31 System.out.println("请输入文件路径");32 Scanner in=newScanner(System.in);33 directory=in.next();//读入文件路径

34 System.out.println("请输入文件名");35 filename=in.next();//读入文件名

36 System.out.println("请输入文件格式");37 fileFormat=in.next();//读入文件格式

38 grayImage();//灰度化

39 histogramEqualization();//均衡化并输出

40 System.out.println("请输入线性变换的灰度下限");41 mi=in.nextInt();42 System.out.println("请输入线性变换的灰度上限");43 ma=in.nextInt();44 linearConversion();45 grayStretch();46 }47

48 //灰度化

49 public static void grayImage() throwsIOException, InterruptedException50 {51 File input=new File(directory+"\\"+filename+"."+fileFormat);52 BufferedImage reader=ImageIO.read(input);//图片文件读入流

53

54 iwidth=reader.getWidth();55 iheight=reader.getHeight();56 pixels=new int[iwidth*iheight];57 pixels2=new int[iwidth*iheight];58 pixels3=new int[iwidth*iheight];59

60 BufferedImage grayImage=new BufferedImage(iwidth,iheight,BufferedImage.TYPE_BYTE_GRAY);//无符号 byte 灰度级图像

61 for(int i=0;i>16)+0.59*((rgb&0xff00)>>8))+0.11*((rgb&0xff)));66 rgb=255<<24|grey<<16|grey<<8|grey;67 grayImage.setRGB(i, j, rgb);68 }//读入所有像素,转换图像信号,使其灰度化

69 tmp=grayImage;70 PixelGrabber pg=new PixelGrabber(tmp, 0, 0, iwidth, iheight, pixels,0,iwidth);71 pg.grabPixels();//将该灰度化后的图片所有像素点读入pixels数组

72 PixelGrabber pg2=new PixelGrabber(tmp, 0, 0, iwidth, iheight, pixels2,0,iwidth);73 pg2.grabPixels();74 PixelGrabber pg3=new PixelGrabber(tmp, 0, 0, iwidth, iheight, pixels3,0,iwidth);75 pg3.grabPixels();//76 }77

78 //直方图均衡

79 public static void histogramEqualization() throwsInterruptedException, IOException80 {81 //PixelGrabber pg=new PixelGrabber(tmp, 0, 0, iwidth, iheight, pixels,0,iwidth);82 //pg.grabPixels();

83 BufferedImage greyImage=newBufferedImage(iwidth, iheight, BufferedImage.TYPE_BYTE_GRAY);84

85 for(int i=0;i

91 double a=(double)255/(iwidth*iheight);92 double[] c=new double[256];93 c[0]=(a*histogram[0]);94 for(int i=1;i<256;i++)95 c[i]=c[i-1]+(int)(a*histogram[i]);//直方图均衡化(离散情况)

96 for(int i=0;i

107 }108

109 //灰度线性变换

110 public static void linearConversion() throwsIOException111 {112 int min=255,max=0;113 for(int i=0;i<256;i++)114 {115 if(histogram[i]>0)116 {117 if(imax)120 max=i;121 }122 }//找出灰度的最大级和最小级

123 double k=(ma-mi)/(max-min);//计算变换比

124 BufferedImage greyImage=newBufferedImage(iwidth, iheight, BufferedImage.TYPE_BYTE_GRAY);125 for(int i=0;i255)131 grey=255;132 if(grey<0)133 grey=0;134 pixels2[i*iwidth+j]=255<<24|grey<<16|grey<<8|grey;135 greyImage.setRGB(j, i, pixels2[i*iwidth+j]);136 }//灰度线性变换

137 File f=new File(directory+"\\"+"线性变换.jpg");138 ImageIO.write(greyImage, "jpg", f);//在原路径下输出均衡化后的图像

139 }140

141 //灰度拉伸

142 public static void grayStretch() throwsIOException143 {144 int min = 0,max = 1;145 int sum=0;146 for(int i=0;i<256;i++)147 {148 sum+=histogram[i];149 if(sum>iwidth*iheight*0.05)150 {151 min=i;152 break;153 }154 }//找出灰度的大部分像素范围的最小级

155 sum=0;156 for(int i=255;i>=0;i--)157 {158 sum+=histogram[i];159 if(sum>iwidth*iheight*0.05)160 {161 max=i;162 break;163 }164 }//找出灰度的大部分像素范围的最大级

165 double k=(ma-mi)/(max-min);166 BufferedImage greyImage=newBufferedImage(iwidth, iheight, BufferedImage.TYPE_BYTE_GRAY);167 for(int i=0;i

173 else if(grey>=max)174 grey=(int) ma;//大于max部分设为上限

175 else

176 {177 grey=(int)(k*(grey-min)+mi);178 if(grey>255)179 grey=255;180 if(grey<0)181 grey=0;182 }//大部分区域线性变换

183

184 pixels3[i*iwidth+j]=255<<24|grey<<16|grey<<8|grey;185 greyImage.setRGB(j, i, pixels3[i*iwidth+j]);186 }//灰度拉伸

187 File f=new File(directory+"\\"+"灰度拉伸.jpg");188 ImageIO.write(greyImage, "jpg", f);//在原路径下输出拉伸后的图像

189 }190 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值