java实现图象灰度转换,腐蚀,均衡化
2008-06-19 15:32
127 查看
package com.test;
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import javax.imageio.ImageIO;
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;
public class ColorPaint extends JFrame {
//保存当前操作的像素矩阵
private int currentPixArray[]=null;
//图像的路径
private String fileString=null;
//用于显示图像的标签
private JLabel imageLabel=null;
//加载的图像
private BufferedImage newImage;
//图像的高和宽
private int h,w;
//保存历史操作图像矩阵
private LinkedList<int[]> imageStack=new LinkedList<int[]>();
private LinkedList<int[]> tempImageStack=new LinkedList<int[]>();
public ColorPaint(String title){
super(title);
this.setSize(800,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建菜单
JMenuBar jb=new JMenuBar();
JMenu fileMenu=new JMenu("文件");
jb.add(fileMenu);
JMenuItem openImageMenuItem=new JMenuItem("打开图像");
fileMenu.add(openImageMenuItem);
openImageMenuItem.addActionListener(new OpenListener());
JMenuItem exitMenu=new JMenuItem("退出");
fileMenu.add(exitMenu);
exitMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
JMenu operateMenu=new JMenu("图像处理");
jb.add(operateMenu);
JMenuItem RGBtoGrayMenuItem=new JMenuItem("灰度图像转换");
operateMenu.add(RGBtoGrayMenuItem);
RGBtoGrayMenuItem.addActionListener(new RGBtoGrayActionListener());
JMenuItem balanceMenuItem=new JMenuItem("均衡化");
operateMenu.add(balanceMenuItem);
balanceMenuItem.addActionListener(new BalanceActionListener());
JMenuItem blackMenuItem=new JMenuItem("黑色");
operateMenu.add(blackMenuItem);
balanceMenuItem.addActionListener(new BlackActionListener());
JMenuItem whiteMenuItem=new JMenuItem("白色");
operateMenu.add(whiteMenuItem);
balanceMenuItem.addActionListener(new WhiteActionListener());
JMenuItem fsMenuItem=new JMenuItem("腐蚀");
operateMenu.add(fsMenuItem);
fsMenuItem.addActionListener(new fsActionListener());
JMenuItem ksMenuItem=new JMenuItem("扩散");
operateMenu.add(ksMenuItem);
ksMenuItem.addActionListener(new ksActionListener());
JMenu frontAndBackMenu=new JMenu("历史操作");
jb.add(frontAndBackMenu);
JMenuItem backMenuItem=new JMenuItem("后退");
frontAndBackMenu.add(backMenuItem);
backMenuItem.addActionListener(new BackActionListener());
JMenuItem frontMenuItem=new JMenuItem("前进");
frontAndBackMenu.add(frontMenuItem);
frontMenuItem.addActionListener(new FrontActionListener());
this.setJMenuBar(jb);
imageLabel=new JLabel("");
JScrollPane pane = new JScrollPane(imageLabel);
this.add(pane,BorderLayout.CENTER);
this.setVisible(true);
}
private class OpenListener implements ActionListener{
public void actionPerformed(ActionEvent e){
JFileChooser jc=new JFileChooser();
int returnValue=jc.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jc.getSelectedFile();
if (selectedFile != null) {
fileString=selectedFile.getAbsolutePath();
try{
newImage =ImageIO.read(new File(fileString));
w=newImage.getWidth();
h=newImage.getHeight();
currentPixArray=getPixArray(newImage,w,h);
imageStack.clear();
tempImageStack.clear();
imageStack.addLast(currentPixArray);
imageLabel.setIcon(new ImageIcon(newImage));
}catch(IOException ex){
System.out.println(ex);
}
}
}
ColorPaint.this.repaint();
//MyShowImage.this.pack();
}
}
//////////////////菜单监听器///////////////////////
private class RGBtoGrayActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=RGBtoGray(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BlackActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=black();
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class WhiteActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class fsActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=RGBIron(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class ksActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=extend(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BalanceActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BackActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(imageStack.size()<=1){
JOptionPane.showMessageDialog(null,"此幅图片的处理已经没有后退历史操作了","提示",
JOptionPane.INFORMATION_MESSAGE);
}else{
tempImageStack.addLast(imageStack.removeLast());
currentPixArray=imageStack.getLast();
showImage(currentPixArray);
}
}
}
private class FrontActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(tempImageStack.size()<1){
JOptionPane.showMessageDialog(null,"此幅图片的处理已经没有前进历史操作了","提示",
JOptionPane.INFORMATION_MESSAGE);
}else{
currentPixArray=tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
}
}
}
//////////////////获取图像像素矩阵///////////////////
private int[]getPixArray(Image im,int w,int h){
int[] pix=new int[w*h];
PixelGrabber pg=null;
try{
pg = new PixelGrabber(im, 0, 0, w, h, pix, 0, w);
if(pg.grabPixels()!=true)
try{
throw new java.awt.AWTException("pg error"+pg.status());
}catch(Exception eq){
eq.printStackTrace();
}
} catch(Exception ex){
ex.printStackTrace();
}
return pix;
}
//////////////////显示图片///////////////////////
private void showImage(int[] srcPixArray){
Image pic=createImage(new MemoryImageSource(w,h,srcPixArray,0,w));
ImageIcon ic=new ImageIcon(pic);
imageLabel.setIcon(ic);
imageLabel.repaint();
}
//////////////////灰度转换///////////////////////
private int[] RGBtoGray(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k,r,g,b;
for(i = 0; i < h;i++){
for(j = 0;j < w;j++){
k = i*w+j;
r = colorModel.getRed(ImageSource[k]);
g = colorModel.getGreen(ImageSource[k]);
b = colorModel.getBlue(ImageSource[k]);
// System.out.println(ImageSource[k]);
//System.out.println(ImageSource[k]&0xff);
// System.out.println(r+" "+g+" "+b);
int gray=(int)(r*0.3+g*0.59+b*0.11);
r=g=b=gray;
grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;
// System.out.println(grayArray[i*w+j]);
}
}
return grayArray;
}
//////////////////图像腐蚀///////////////////////
private int[] RGBIron(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k1,k2,k3,k4,k5,k6,k7,k8,r,g,b;
for(i = 1; i < h-1;i++){
for(j = 1;j < w-1;j++){
k1 = (i-1)*w+j-1;
k2 = (i-1)*w+j;
k3 = (i-1)*w+j+1;
k4 = i*w+j-1;
k5 = i*w+j+1;
k6 = (i+1)*w+j-1;
k7 =(i+1)*w+j;
k8 =(i+1)*w+j+1;
r =(int)((double)(colorModel.getRed(ImageSource[k1])+colorModel.getRed(ImageSource[k2])+
colorModel.getRed(ImageSource[k3])+colorModel.getRed(ImageSource[k4])+
colorModel.getRed(ImageSource[k5])+colorModel.getRed(ImageSource[k6])+
colorModel.getRed(ImageSource[k7])+colorModel.getRed(ImageSource[k8]))*0.125);
g =(int)((double)(colorModel.getGreen(ImageSource[k1])+colorModel.getGreen(ImageSource[k2])+
colorModel.getGreen(ImageSource[k3])+colorModel.getGreen(ImageSource[k4])+
colorModel.getGreen(ImageSource[k5])+colorModel.getGreen(ImageSource[k6])+
colorModel.getGreen(ImageSource[k7])+colorModel.getGreen(ImageSource[k8]))*0.125);
b= (int)((double)(colorModel.getBlue(ImageSource[k1])+colorModel.getBlue(ImageSource[k2])+
colorModel.getBlue(ImageSource[k3])+colorModel.getBlue(ImageSource[k4])+
colorModel.getBlue(ImageSource[k5])+colorModel.getBlue(ImageSource[k6])+
colorModel.getBlue(ImageSource[k7])+colorModel.getBlue(ImageSource[k8]))*0.125);
// System.out.println(ImageSource[k]);
// System.out.println("颜色分量值:"+r+" "+g+" "+b);
// System.out.println("值 "+(ImageSource[k]&0xff));
// System.out.println("alpha "+colorModel.getAlpha(ImageSource[k]));
//System.out.println("alpha "+ImageSource[k]);
grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;
// System.out.println(+grayArray[i*w+j]);
}
}
return grayArray;
}
private int[] extend(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k1,k2,k3,k4,k5,k6,k7,k8,r,g,b;
for(i = 1; i < h-1;i++){
for(j = 1;j < w-1;j++){
k1 = (i-1)*w+j-1;
k2 = (i-1)*w+j;
k3 = (i-1)*w+j+1;
k4 = i*w+j-1;
k5 = i*w+j+1;
k6 = (i+1)*w+j-1;
k7 =(i+1)*w+j;
k8 =(i+1)*w+j+1;
r = (colorModel.getRed(ImageSource[k1])+colorModel.getRed(ImageSource[k2])+
colorModel.getRed(ImageSource[k3])+colorModel.getRed(ImageSource[k4])+
colorModel.getRed(ImageSource[k5])+colorModel.getRed(ImageSource[k6])+
colorModel.getRed(ImageSource[k7])+colorModel.getRed(ImageSource[k8]))/8;
g = (colorModel.getGreen(ImageSource[k1])+colorModel.getGreen(ImageSource[k2])+
colorModel.getGreen(ImageSource[k3])+colorModel.getGreen(ImageSource[k4])+
colorModel.getGreen(ImageSource[k5])+colorModel.getGreen(ImageSource[k6])+
colorModel.getGreen(ImageSource[k7])+colorModel.getGreen(ImageSource[k8]))/8;
b= (colorModel.getBlue(ImageSource[k1])+colorModel.getBlue(ImageSource[k2])+
colorModel.getBlue(ImageSource[k3])+colorModel.getBlue(ImageSource[k4])+
colorModel.getBlue(ImageSource[k5])+colorModel.getBlue(ImageSource[k6])+
colorModel.getBlue(ImageSource[k7])+colorModel.getBlue(ImageSource[k8]))/8;
// r=255+r;
// g=255+g;
// b=255+b;
if(r>128)r=255-r;
if(g>128)g=255-g;
if(b>128)b=255-b;
// System.out.println(ImageSource[k]);
// System.out.println("颜色分量值:"+r+" "+g+" "+b);
// System.out.println("值 "+(ImageSource[k]&0xff));
// System.out.println("alpha "+colorModel.getAlpha(ImageSource[k]));
//System.out.println("alpha "+ImageSource[k]);
grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;
//System.out.println(+grayArray[i*w+j]);
}
}
return grayArray;
}
private int[] black(){
int[] dinPixArray=new int[w*h];
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
dinPixArray[i*w+j]=255<<24|255<<16|255<<8|255;;
}
}
return dinPixArray;
}
/////////////////图像均衡化//////////////////////
private int[] balance(int[] srcPixArray){
int[] dinPixArray=new int[w*h];
int sum=0;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
int grey=srcPixArray[i*w+j]&0xff;
sum=sum+grey;
}
}
double avg=sum/(w*h);
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(avg>(srcPixArray[i*w+j]&0xff))
{
dinPixArray[i*w+j]=255<<24|0|0|0;
}
else
{
int hist=(srcPixArray[i*w+j]&0xff)-(int)avg;
dinPixArray[i*w+j]=255<<24|hist<<16|hist<<8|hist;
}
}
}
return dinPixArray;
}
public static void main(String[] args) {
new ColorPaint("ShowImage");
}
}
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import javax.imageio.ImageIO;
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;
public class ColorPaint extends JFrame {
//保存当前操作的像素矩阵
private int currentPixArray[]=null;
//图像的路径
private String fileString=null;
//用于显示图像的标签
private JLabel imageLabel=null;
//加载的图像
private BufferedImage newImage;
//图像的高和宽
private int h,w;
//保存历史操作图像矩阵
private LinkedList<int[]> imageStack=new LinkedList<int[]>();
private LinkedList<int[]> tempImageStack=new LinkedList<int[]>();
public ColorPaint(String title){
super(title);
this.setSize(800,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建菜单
JMenuBar jb=new JMenuBar();
JMenu fileMenu=new JMenu("文件");
jb.add(fileMenu);
JMenuItem openImageMenuItem=new JMenuItem("打开图像");
fileMenu.add(openImageMenuItem);
openImageMenuItem.addActionListener(new OpenListener());
JMenuItem exitMenu=new JMenuItem("退出");
fileMenu.add(exitMenu);
exitMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
JMenu operateMenu=new JMenu("图像处理");
jb.add(operateMenu);
JMenuItem RGBtoGrayMenuItem=new JMenuItem("灰度图像转换");
operateMenu.add(RGBtoGrayMenuItem);
RGBtoGrayMenuItem.addActionListener(new RGBtoGrayActionListener());
JMenuItem balanceMenuItem=new JMenuItem("均衡化");
operateMenu.add(balanceMenuItem);
balanceMenuItem.addActionListener(new BalanceActionListener());
JMenuItem blackMenuItem=new JMenuItem("黑色");
operateMenu.add(blackMenuItem);
balanceMenuItem.addActionListener(new BlackActionListener());
JMenuItem whiteMenuItem=new JMenuItem("白色");
operateMenu.add(whiteMenuItem);
balanceMenuItem.addActionListener(new WhiteActionListener());
JMenuItem fsMenuItem=new JMenuItem("腐蚀");
operateMenu.add(fsMenuItem);
fsMenuItem.addActionListener(new fsActionListener());
JMenuItem ksMenuItem=new JMenuItem("扩散");
operateMenu.add(ksMenuItem);
ksMenuItem.addActionListener(new ksActionListener());
JMenu frontAndBackMenu=new JMenu("历史操作");
jb.add(frontAndBackMenu);
JMenuItem backMenuItem=new JMenuItem("后退");
frontAndBackMenu.add(backMenuItem);
backMenuItem.addActionListener(new BackActionListener());
JMenuItem frontMenuItem=new JMenuItem("前进");
frontAndBackMenu.add(frontMenuItem);
frontMenuItem.addActionListener(new FrontActionListener());
this.setJMenuBar(jb);
imageLabel=new JLabel("");
JScrollPane pane = new JScrollPane(imageLabel);
this.add(pane,BorderLayout.CENTER);
this.setVisible(true);
}
private class OpenListener implements ActionListener{
public void actionPerformed(ActionEvent e){
JFileChooser jc=new JFileChooser();
int returnValue=jc.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jc.getSelectedFile();
if (selectedFile != null) {
fileString=selectedFile.getAbsolutePath();
try{
newImage =ImageIO.read(new File(fileString));
w=newImage.getWidth();
h=newImage.getHeight();
currentPixArray=getPixArray(newImage,w,h);
imageStack.clear();
tempImageStack.clear();
imageStack.addLast(currentPixArray);
imageLabel.setIcon(new ImageIcon(newImage));
}catch(IOException ex){
System.out.println(ex);
}
}
}
ColorPaint.this.repaint();
//MyShowImage.this.pack();
}
}
//////////////////菜单监听器///////////////////////
private class RGBtoGrayActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=RGBtoGray(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BlackActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=black();
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class WhiteActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class fsActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=RGBIron(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class ksActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=extend(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BalanceActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int[] resultArray=balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BackActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(imageStack.size()<=1){
JOptionPane.showMessageDialog(null,"此幅图片的处理已经没有后退历史操作了","提示",
JOptionPane.INFORMATION_MESSAGE);
}else{
tempImageStack.addLast(imageStack.removeLast());
currentPixArray=imageStack.getLast();
showImage(currentPixArray);
}
}
}
private class FrontActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(tempImageStack.size()<1){
JOptionPane.showMessageDialog(null,"此幅图片的处理已经没有前进历史操作了","提示",
JOptionPane.INFORMATION_MESSAGE);
}else{
currentPixArray=tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
}
}
}
//////////////////获取图像像素矩阵///////////////////
private int[]getPixArray(Image im,int w,int h){
int[] pix=new int[w*h];
PixelGrabber pg=null;
try{
pg = new PixelGrabber(im, 0, 0, w, h, pix, 0, w);
if(pg.grabPixels()!=true)
try{
throw new java.awt.AWTException("pg error"+pg.status());
}catch(Exception eq){
eq.printStackTrace();
}
} catch(Exception ex){
ex.printStackTrace();
}
return pix;
}
//////////////////显示图片///////////////////////
private void showImage(int[] srcPixArray){
Image pic=createImage(new MemoryImageSource(w,h,srcPixArray,0,w));
ImageIcon ic=new ImageIcon(pic);
imageLabel.setIcon(ic);
imageLabel.repaint();
}
//////////////////灰度转换///////////////////////
private int[] RGBtoGray(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k,r,g,b;
for(i = 0; i < h;i++){
for(j = 0;j < w;j++){
k = i*w+j;
r = colorModel.getRed(ImageSource[k]);
g = colorModel.getGreen(ImageSource[k]);
b = colorModel.getBlue(ImageSource[k]);
// System.out.println(ImageSource[k]);
//System.out.println(ImageSource[k]&0xff);
// System.out.println(r+" "+g+" "+b);
int gray=(int)(r*0.3+g*0.59+b*0.11);
r=g=b=gray;
grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;
// System.out.println(grayArray[i*w+j]);
}
}
return grayArray;
}
//////////////////图像腐蚀///////////////////////
private int[] RGBIron(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k1,k2,k3,k4,k5,k6,k7,k8,r,g,b;
for(i = 1; i < h-1;i++){
for(j = 1;j < w-1;j++){
k1 = (i-1)*w+j-1;
k2 = (i-1)*w+j;
k3 = (i-1)*w+j+1;
k4 = i*w+j-1;
k5 = i*w+j+1;
k6 = (i+1)*w+j-1;
k7 =(i+1)*w+j;
k8 =(i+1)*w+j+1;
r =(int)((double)(colorModel.getRed(ImageSource[k1])+colorModel.getRed(ImageSource[k2])+
colorModel.getRed(ImageSource[k3])+colorModel.getRed(ImageSource[k4])+
colorModel.getRed(ImageSource[k5])+colorModel.getRed(ImageSource[k6])+
colorModel.getRed(ImageSource[k7])+colorModel.getRed(ImageSource[k8]))*0.125);
g =(int)((double)(colorModel.getGreen(ImageSource[k1])+colorModel.getGreen(ImageSource[k2])+
colorModel.getGreen(ImageSource[k3])+colorModel.getGreen(ImageSource[k4])+
colorModel.getGreen(ImageSource[k5])+colorModel.getGreen(ImageSource[k6])+
colorModel.getGreen(ImageSource[k7])+colorModel.getGreen(ImageSource[k8]))*0.125);
b= (int)((double)(colorModel.getBlue(ImageSource[k1])+colorModel.getBlue(ImageSource[k2])+
colorModel.getBlue(ImageSource[k3])+colorModel.getBlue(ImageSource[k4])+
colorModel.getBlue(ImageSource[k5])+colorModel.getBlue(ImageSource[k6])+
colorModel.getBlue(ImageSource[k7])+colorModel.getBlue(ImageSource[k8]))*0.125);
// System.out.println(ImageSource[k]);
// System.out.println("颜色分量值:"+r+" "+g+" "+b);
// System.out.println("值 "+(ImageSource[k]&0xff));
// System.out.println("alpha "+colorModel.getAlpha(ImageSource[k]));
//System.out.println("alpha "+ImageSource[k]);
grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;
// System.out.println(+grayArray[i*w+j]);
}
}
return grayArray;
}
private int[] extend(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k1,k2,k3,k4,k5,k6,k7,k8,r,g,b;
for(i = 1; i < h-1;i++){
for(j = 1;j < w-1;j++){
k1 = (i-1)*w+j-1;
k2 = (i-1)*w+j;
k3 = (i-1)*w+j+1;
k4 = i*w+j-1;
k5 = i*w+j+1;
k6 = (i+1)*w+j-1;
k7 =(i+1)*w+j;
k8 =(i+1)*w+j+1;
r = (colorModel.getRed(ImageSource[k1])+colorModel.getRed(ImageSource[k2])+
colorModel.getRed(ImageSource[k3])+colorModel.getRed(ImageSource[k4])+
colorModel.getRed(ImageSource[k5])+colorModel.getRed(ImageSource[k6])+
colorModel.getRed(ImageSource[k7])+colorModel.getRed(ImageSource[k8]))/8;
g = (colorModel.getGreen(ImageSource[k1])+colorModel.getGreen(ImageSource[k2])+
colorModel.getGreen(ImageSource[k3])+colorModel.getGreen(ImageSource[k4])+
colorModel.getGreen(ImageSource[k5])+colorModel.getGreen(ImageSource[k6])+
colorModel.getGreen(ImageSource[k7])+colorModel.getGreen(ImageSource[k8]))/8;
b= (colorModel.getBlue(ImageSource[k1])+colorModel.getBlue(ImageSource[k2])+
colorModel.getBlue(ImageSource[k3])+colorModel.getBlue(ImageSource[k4])+
colorModel.getBlue(ImageSource[k5])+colorModel.getBlue(ImageSource[k6])+
colorModel.getBlue(ImageSource[k7])+colorModel.getBlue(ImageSource[k8]))/8;
// r=255+r;
// g=255+g;
// b=255+b;
if(r>128)r=255-r;
if(g>128)g=255-g;
if(b>128)b=255-b;
// System.out.println(ImageSource[k]);
// System.out.println("颜色分量值:"+r+" "+g+" "+b);
// System.out.println("值 "+(ImageSource[k]&0xff));
// System.out.println("alpha "+colorModel.getAlpha(ImageSource[k]));
//System.out.println("alpha "+ImageSource[k]);
grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;
//System.out.println(+grayArray[i*w+j]);
}
}
return grayArray;
}
private int[] black(){
int[] dinPixArray=new int[w*h];
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
dinPixArray[i*w+j]=255<<24|255<<16|255<<8|255;;
}
}
return dinPixArray;
}
/////////////////图像均衡化//////////////////////
private int[] balance(int[] srcPixArray){
int[] dinPixArray=new int[w*h];
int sum=0;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
int grey=srcPixArray[i*w+j]&0xff;
sum=sum+grey;
}
}
double avg=sum/(w*h);
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(avg>(srcPixArray[i*w+j]&0xff))
{
dinPixArray[i*w+j]=255<<24|0|0|0;
}
else
{
int hist=(srcPixArray[i*w+j]&0xff)-(int)avg;
dinPixArray[i*w+j]=255<<24|hist<<16|hist<<8|hist;
}
}
}
return dinPixArray;
}
public static void main(String[] args) {
new ColorPaint("ShowImage");
}
}
相关文章推荐
- Java实现24位真彩转换为8位灰度图片
- java实现酷狗音乐临时缓存文件转换为MP3文件的方法
- 中缀表达式转换为前缀及后缀表达式并求值(java实现)
- java实现silk音频文件转换成mp3
- JAVA 中实现整句汉字拆分、转换为ASCII实例详解
- Java对话框实现字符串反转,字符串大小写转换的程序实现
- 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例
- 数据结构Java实现06----中缀表达式转换为后缀表达式
- java将图片缩放实现类(能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换)
- java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)
- 【java基础】在Java中实现基本数据类型与字符、字符串之间的转换
- 把Excel表转换XML文档(java实现jxl+jdom)
- 进制之间的转换(java代码实现)
- Java实现数组、List互相转换
- java实现小写金额转换大写金额
- Java+Windows+ffmpeg实现视频转换
- JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
- java 实现字符串全角转半角、半角到全角的转换
- 文字转换为二进制/十六进制(Uncode编码 java实现)
- java对象和Map之间互相转换的三种实现方式