package com.wu;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
public class Main extends JFrame{
//显示源图像的标签,并将其加入滚动条
JLabel jls=new JLabel();
JScrollPane jspz=new JScrollPane(jls);
//显示目标图像的标签,并将其加入滚动条
JLabel jlt=new JLabel();
JScrollPane jspy=new JScrollPane(jlt);
//分隔窗口,并将控件加入
JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);
//文件选择器
JFileChooser jfc=new JFileChooser("d:/法拉立");
//菜单栏,菜单以及菜单项
JMenuBar jmb=new JMenuBar();
JMenu jme=new JMenu("文件");
JMenuItem []jmit={new JMenuItem("打开图像"),new JMenuItem("清空图像"),new JMenuItem("图像处理"),new JMenuItem("车牌定位"),new JMenuItem("退出操作"),};
//创建不同的滤镜的卷积矩阵数组
float[][]data={
//加强边缘
{0f,-1f,0f,-1f,5f,-1f,0f,-1f,0f},
//锐化
{-0.125f,-0.125f,-0.125f,
-0.125f,2f,-0.125f,
-0.125f,-0.125f,-0.125f},
//模糊
{0.09375f,0.09375f,0.09375f,
0.09375f,0.25f,0.09375f,
0.09375f,0.09375f,0.09375f},
//浮雕
{2f,0f,2f,
0f,0f,0f,
2f,0f,-5f},
//边缘检测
{0.0f,-1.0f,0.0f,-1.0f,4.f,-1.0f,0.0f,-1.0f,0.0f}
};
//定义一个图标
ImageIcon ii;
public Main(){
super("图像处理示例");
this.setBounds(150,100, 1000, 500);
//默认的布局为BorderLayout()
//循环将菜单项添加进文件菜单,并为每个菜单项注册动作事件监听器
for(int j=0;j<jmit.length;j++){
jme.add(jmit[j]);
}
jmit[0].addActionListener(new Handler1());//打开
jmit[1].addActionListener(new Handler2());//清空
jmit[2].addActionListener(new Handler9());//处理
jmit[3].addActionListener(new Handler4());//定位
jmit[4].addActionListener(new Handler3());//退出
//将菜单添加进菜单栏,并将菜单栏添加进窗体
jmb.add(jme);
this.setJMenuBar(jmb);
//将分割窗格添加到窗体中
this.add(jsp);
//关闭动作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(true);
}
//打开图像
class Handler1 implements ActionListener{
public void actionPerformed(ActionEvent e) {
//加载选择的图片到图标对象中
ii=this.chooserFile();
//将图片设置到源标签中
jls.setIcon(ii);
//设置两个标签的水平、垂直对齐方式
jls.setVerticalAlignment(JLabel.CENTER);
jls.setHorizontalAlignment(JLabel.CENTER);
jlt.setVerticalAlignment(JLabel.CENTER);
jlt.setHorizontalAlignment(JLabel.CENTER);
//将处理后的图片设置到目标标签中
jlt.setIcon(ii);
//设置分隔条的宽度以及初始位置
jsp.setDividerLocation(500);
jsp.setDividerSize(4);
}
/*
* 加载选中图片的方法
*
*/
public ImageIcon chooserFile()
{
//弹出文件选择器
int i=jfc.showOpenDialog(null);
//获取选择文件的路径
String dir=(jfc.getSelectedFile()!=null)?(jfc.getSelectedFile().getPath()):null;
if(dir!=null&&!dir.equals(""))
{
//按指定的路径加载图片到图标对象中并返回
return new ImageIcon(dir);
}
return null;
}
}
//处理
class Handler9 implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(ii==null||ii.equals("")){
JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
"Alert",JOptionPane.WARNING_MESSAGE);
}
else
{
int width=ii.getImage().getWidth(null);
int height=ii.getImage().getHeight(null);
//bi的存在是为了要把img转换成BufferedImage.这招瞒有用
BufferedImage bi= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//将待处理图像绘制到源BufferedImage对像图像中
Graphics g=bi.getGraphics();
//将待处理图像绘制到源BufferedImage对像图像中
g.drawImage(ii.getImage(),0,0,null);
//存卷积后的BufferedImage(处理后的图像)
BufferedImage bimg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Kernel kernel=new Kernel(3,3,data[4]); //根据data建个3X3的矩阵
//ConvolveOp 专门用于图像的卷积
ConvolveOp cop=new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
cop.filter(bi,bimg); //过滤后生成新的BufferedImage
//获取处理后的图像并设置到目标标签中
jlt.setIcon(new ImageIcon(bimg));
}
}
}
class Handler4 implements ActionListener{
private int minHorizontalPos = 0;
private int maxHorizontalPos = 0;
private int minVerticalPos = 0;
private int maxVerticalPos = 0;
private BufferedImage bi;
private int width;
private int height;
private int pixels[][][] ;
private int[] histogramArray = null;
public void actionPerformed(ActionEvent e){
if(ii==null||ii.equals("")){
JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
"Alert",JOptionPane.WARNING_MESSAGE);
}
else
{
width=ii.getImage().getWidth(null);
height=ii.getImage().getHeight(null);
//bi的存在是为了要把img转换成BufferedImage.这招瞒有用
bi= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//将待处理图像绘制到源BufferedImage对像图像中
Graphics g=bi.getGraphics();
//将待处理图像绘制到源BufferedImage对像图像中
g.drawImage(ii.getImage(),0,0,null);
//存卷积后的BufferedImage(处理后的图像)
BufferedImage bimg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
pixels = new int[width][height][4];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int pixel = bi.getRGB(i, j);
//System.out.println(pixel+"========"+Integer.toBinaryString(pixel));
pixels[i][j][0] = getAlphaCoordinate(pixel);
//System.out.println("pixels[i][j][0]"+pixels[i][j][0]+"========"+Integer.toBinaryString(pixels[i][j][0]));
pixels[i][j][1] = getRedCoordinate(pixel);
//System.out.println("pixels[i][j][1]"+pixels[i][j][1]+"========"+Integer.toBinaryString(pixels[i][j][1]));
pixels[i][j][2] = getGreenCoordinate(pixel);
//System.out.println("pixels[i][j][2]"+pixels[i][j][2]+"========"+Integer.toBinaryString(pixels[i][j][2]));
pixels[i][j][3] = getBlueCoordinate(pixel);
//System.out.println("pixels[i][j][3]"+pixels[i][j][3]+"========"+Integer.toBinaryString(pixels[i][j][3]));
}
}
//灰度
histogramArray = new int[256];//灰度直方图,灰度等于某个值的个数有多少
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int grayValue = (int) (pixels[i][j][1] * 0.30 + pixels[i][j][2] * 0.59 + pixels[i][j][3] * 0.11 + 0.5);
//灰度化,R=G=L
pixels[i][j][1] = grayValue;
pixels[i][j][2] = grayValue;
pixels[i][j][3] = grayValue;
histogramArray[grayValue]++;
}
}
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
bi.setRGB(i, j, getGRB(pixels[i][j][0], pixels[i][j][1], pixels[i][j][2], pixels[i][j][3]));
}
}
//直方图均衡化,增强图片对比度
int totalPixels = width * height;
double[] densityArray = new double[256];//灰度密度,灰度等于某个值的概率有多少
double[] distributionArray = new double[256];//灰度
评论0