package com.ky415.ImagePreprocess;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.ImageProducer;
import java.awt.image.MemoryImageSource;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class ImagePreprocess extends JFrame implements ActionListener {
Image iImage;
BufferedImage bufferedImg;
int iw, ih;
int[] pix,pix2;
public ImagePreprocess() {
setTitle("图像预处理");
this.setBackground(Color.lightGray);
// 菜单界面
setMenu();
// 关闭窗口
closeWin();
setSize(600, 550);
setLocation(700, 10);
setVisible(true);
}
public static void main(String[] args) {
new ImagePreprocess();
}
public void paint(Graphics g) {
g.clearRect(0, 0, 600, 550);
g.drawImage(iImage, 5, 50, null);
}
//将数组pix转化为图像序列pixels
public int[] toPixels(int[][] pix, int iw, int ih)
{
int[] pi = new int[iw*ih];
for(int j = 0; j < ih; j++)
{
for(int i = 0; i < iw; i++)
{
int c = pix[i][j];
if(c < 0) c = c + 256;
pi[i+j*iw] = (255<<24)|(c<<16)|(c<<8)|c;
}
}
return pi;
}
//显示数据
public void draw(Graphics g, int x1, int y1, int x2, int y2, String str)
{
g.clearRect(270,50,526,306);
g.setColor(Color.red);
g.drawLine(270,305,525,305); //x轴
g.drawLine(270,305,270,50); //y轴
g.drawLine(270,305,270+x1,305-y1); //(0,0)-(x1,y1)
g.drawLine(270+x1,305-y1,270+x2,305-y2);//(x1,y1)-(x2,y2)
g.drawLine(270+x2,305-y2,525,50); //(x2,y2)-(255,255)
g.setColor(Color.BLUE);
g.drawString("(x1,y1)",255+x1,290-y1);
g.drawString("(x2,y2)",255+x2,325-y2);
g.drawString(str,340,70);
}
public void actionPerformed(ActionEvent evt) {
Graphics graph = getGraphics();
if (evt.getSource() == openItem) {
// 文件选择对话框
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("./images"));
int r = chooser.showOpenDialog(null);
MediaTracker tracker = new MediaTracker(this);
if (r == JFileChooser.APPROVE_OPTION) {
String name = chooser.getSelectedFile().getAbsolutePath();
File inputFile = new File(name);
bufferedImg = null;
try {
bufferedImg = ImageIO.read(inputFile);
} catch (IOException e) {
e.printStackTrace();
}
iw = bufferedImg.getWidth();
ih = bufferedImg.getHeight();
iImage=(Image)bufferedImg;
repaint();
}
}
else if (evt.getSource() == RGBItem)
{
setTitle("RGB肤色模型");
int[][] iPix = new int[iw][ih];
int green = 0, red = 0, blue = 0;
for (int i = 0; i < bufferedImg.getWidth(); i++) {
for (int j = 0; j < bufferedImg.getHeight(); j++) {
Object data = bufferedImg.getRaster().getDataElements(
i, j, null);// 获取该点像素,并以object类型表示
red = bufferedImg.getColorModel().getRed(data);
blue = bufferedImg.getColorModel().getBlue(data);
green = bufferedImg.getColorModel().getGreen(data);
int max,min;
System.out.println(red + " " + green + " " + blue);
if (red > 95 && green > 40 && blue > 20 && red > blue
&& red > green && Math.abs(red - green) > 15) {
if (blue >= green) {
max = blue;
min = green;
} else {
max = green;
min = blue;
}
if (red > max)
max = red;
else if (red < min)
min = red;
if (max - min > 15) {
iPix[i][j] = 255;
} else {
iPix[i][j] = 0;
}
} else {
iPix[i][j] = 0;
}
// Raster r = bufferedImg.setRGB(x, y, rgb)
// bufferedImg.setData(R);
}
}
// iImage = createImage(mis);
//将数组pix转化为图像序列pixels
pix = toPixels(iPix, iw, ih);
//将数组中的象素产生一个图像
ImageProducer ip = new MemoryImageSource(iw, ih, pix, 0, iw);
iImage = createImage(ip);
//repaint();
// Graphics graph = getGraphics();
graph.drawImage(iImage, 300, 50, null);
// graph.drawString("title",20,450);
}
else if (evt.getSource() == YCbCrItem)
{
setTitle("YCbCr肤色模型");
int[][] iPix = new int[iw][ih];
int green = 0, red = 0, blue = 0;
for (int i = 0; i < bufferedImg.getWidth(); i++) {
for (int j = 0; j < bufferedImg.getHeight(); j++) {
Object data = bufferedImg.getRaster().getDataElements(
i, j, null);
// 获取该点像素,并以object类型表示
red = bufferedImg.getColorModel().getRed(data);
blue = bufferedImg.getColorModel().getBlue(data);
green = bufferedImg.getColorModel().getGreen(data);
int max,min;
System.out.println(red + " " + green + " " + blue);
//计算Cb值与Cr值
double Cb = 128 - 0.168736*red - 0.331264*green + 0.5*blue;
double Cr = 128 + 0.5*red - 0.418688*green - 0.081312*blue;
//当判断该像素点是否满足肤色要求
if(Cb > 77 && Cb<127 && Cr>133 && Cr<173)
iPix[i][j] = 255;
else
iPix[i][j] = 0;
}
}
// iImage = createImage(mis);
//将数组pix转化为图像序列pixels
pix = toPixels(iPix, iw, ih);
//将数组中的象素产生一个图像
ImageProducer ip = new MemoryImageSource(iw, ih, pix, 0, iw);
iImage = createImage(ip);
//repaint();
// Graphics graph = getGraphics();
graph.drawImage(iImage, 300, 50, null);
// graph.drawString("title",20,450);
}
else if (evt.getSource() == LSBItem)
{
setTitle("LSB结果统计");
int[][] iPix = new int[iw][ih];
int green = 0, red = 0, blue = 0;
double LSB0 = 0;
double LSB1 = 0;
for (int i = 0; i < bufferedImg.getWidth(); i++) {
for (int j = 0; j < bufferedImg.getHeight(); j++) {
Object data = bufferedImg.getRaster().getDataElements(
i, j, null);
// 获取该点像素,并以object类型表示
red = bufferedImg.getColorModel().getRed(data);
blue = bufferedImg.getColorModel().getBlue(data);
green = bufferedImg.getColorModel().getGreen(data);
System.out.println(red + " " + green + " " + blue);
//最低有效位平面(LSB)为0,处理为黑色
if(red % 2 == 0){
LSB0 ++;
iPix[i][j] = 0;
}
//最低有效位平面(LSB)为1,处理为白色
else{
LSB1 ++;
iPix[i][j] = 255;
}
}
}
double result = LSB0 / LSB1;
setTitle("LSB结果统计中 LSB0/LSB1 的结果为" + result);
// iImage = createImage(mis);
//将数组pix转化为图像序列pixels
pix = toPixels(iPix, iw, ih);
//将数组中的象素产生一个图像
ImageProducer ip = new MemoryImageSource(iw, ih, pix, 0, iw);
iImage = createImage(ip);
//repaint();
// Graphics graph = getGraphics();
graph.drawImage(iImage, 300, 50, null);
// graph.drawString("title",20,450);
}
else if (evt.getSource() == CoItem)
{
setTitle("灰度处理");
//设定偏移量
int glcmDis = 3;
int maxGrayLevel = 0;
//设定灰度阶级
int grayLevel = 16;
int[][] iPix = new int[iw][ih];
int green = 0, red = 0, blue = 0;
for (int i = 0
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ImagePreprocess.rar (10个子文件)
ImagePreprocess
bin
com
ky415
ImagePreprocess
ImagePreprocess.class 10KB
ImagePreprocess$1.class 797B
images
test1.jpg 95KB
mytest.jpg 112KB
test.png 329KB
.settings
org.eclipse.core.resources.prefs 97B
org.eclipse.jdt.core.prefs 629B
src
com
ky415
ImagePreprocess
ImagePreprocess.java 13KB
.project 391B
.classpath 301B
共 10 条
- 1
资源评论
卖画的作家
- 粉丝: 29
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功