一.图片数据描述
图片:是代表能处理的数码照片,而不是光成像照片,只要是存储在计算机上的内容都是数字化的二进制编码组成的。图片RGB值是由三组byte组成的( 255.255.255(白色)),所以它可以看成一个整数,白色即为:16,777,215。
图片是一个二维结构,由给定长宽数量的像素点组成,所以,所有的图片数据都可以看成是一个int类型的二维数组。(另外,在计算机内存中,二维数组和一维数组一样,都是线性结构,而非真正的二维结构。)
二.代码结构
1.先写一个界面
package cs0119;
import javax.swing.JFrame;
import java.awt.*;
import java.util.Random;
public class ImagePad extends JFrame{
public static void main(String[] args) {
ImagePad imgpad = new ImagePad();
imgpad.initUI();
}
public void initUI(){
this.setTitle("图像处理");
this.setSize(800,800);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void paint(Graphics g){
super.paint(g);
//下接绘制的代码
}
}
2.200*200像素随机色彩的图案
Random random = new Random();
int[][] imgarr = new int[200][200];
int[] arr = imgarr[0];
imgarr[1][0] = 10;
for(int i = 0 ; i < 200 ; i++){
for(int j = 0 ; j < 200 ; j++){
int randomRGB = random.nextInt(16777215);
imgarr[i][j] = randomRGB;
Color color = new Color(randomRGB);
g.setColor(color);
g.fillRect(100+i,100+j,1,1);
}
}
将图案复制一遍并降低一半亮度
for(int i = 0 ; i < 200 ; i++){
for(int j = 0 ; j < 200 ; j++){
int rgb = imgarr[i][j];
Color color = new Color(rgb);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
Color ncolor = new Color(red/2, green/2, blue/2);
g.setColor(ncolor);
g.fillRect(400+i , 100+j , 1 ,1);
}
}
3.写一个能直接根据计算机路径获取图片的函数并将图片复制在界面上
@Override
public void paint(Graphics g){
super.paint(g);
//下接绘制的代码
int [][] imgarr = getPixelArray("C:\\Users\\ch\\Desktop\\zxc.png");
int w = imgarr.length;
int h = imgarr[0].length;
for(int i = 0 ; i < w ; i++){
for(int j = 0 ; j < h ; j++){
int rgb = imgarr[i][j];
Color color = new Color(rgb);
g.setColor(color);
g.fillRect(50+i,50+j,1,1);
}
}
}
public int[][] getPixelArray(String imgPath){
File file = new File(imgPath);
BufferedImage buffimg = null;
try{
buffimg = ImageIO.read(file);
}catch(IOException e){
e.printStackTrace();
}
int w = buffimg.getWidth();
int h = buffimg.getHeight();
int[][] imgarr = new int[w][h];
for(int i = 0 ; i < w ; i++){
for(int j = 0 ; j < h ; j++){
imgarr[i][j] = buffimg.getRGB(i,j);
}
}
return imgarr;
}
4.对这个图像进行各种图像的操作
亮度调整:
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
Color ncolor = new Color(red/2 , green/2,blue/2);
g.setColor(ncolor);
依据灰度值的图像二值化
Color color = new Color(rgb);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int gray = (red + green + blue)/3;
if(gray冷色调Color color = new Color(rgb);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
Color ncolor = new Color(red/2,green/2,blue);
g.setColor(ncolor);
g.fillRect(50+i,50+j,1,1);暖色调Color color = new Color(rgb);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
Color ncolor = new Color(red,green,blue/2);
g.setColor(ncolor);
g.fillRect(50+i,50+j,1,1);一个非常简单的面部提亮效果Color color = new Color(rgb);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int nred = red > 220 ? 250 : red + 30;
int ngreen = green > 220 ? 250 : green + 30;
int nblue = blue > 220 ? 250: blue + 30;
Color ncolor = new Color(nred,ngreen,nblue);
int gray = (red+green+blue)/3;
if(gray图像锐化处理核心公式:int sharprgb = 5*imgarr[i][j]-imgarr[i-1][j]-imgarr[i+1][j]-imgarr[i][j-1]-imgarr[i][j+1];效果不明显,需要更高级的锐化算法。
Original: https://blog.csdn.net/qq_51874588/article/details/122610156
Author: qq_51874588
Title: java项目-图像处理1
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/645435/
转载文章受原作者版权保护。转载请注明原作者出处!