图像是由一个个像素点组合而成,图像处理本身实际上是遍历图像的像素点,对像素点的RGB值进行更改,以达到图像处理的目的。
接下来,我们主要介绍一下图片转化为二维像素点数组的方法以及部分图像处理如灰度、二值化、浮雕、去色的实现。
将图片转化为一个二维像素点数组
定义一个方法用来通过图片路径获得图片,并将其拆分为一个二维像素点数组,方便后续对像素点进行处理:
public int[][] getImagepix(String Path){
File file = new File(Path);
BufferedImage Buffimg = null;
try {
Buffimg=ImageIO.read(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Buffimg.getHeight();
Buffimg.getWidth();
int num =Math.max(Buffimg.getWidth(), Buffimg.getHeight());
int[][] imgdata = new int[num][num];
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++) {
if(i<Buffimg.getWidth()&&j<Buffimg.getHeight())
imgdata[i][j]=Buffimg.getRGB(i, j);
else imgdata[i][j]=0;
}
}
return imgdata;
}
灰度
灰度处理是通过转灰度的算法改变像素点的RGB值后进行绘制。
这里使用的RGB转灰度算法为Gray = R0.299 + G0.587 + B*0.114。
Graphics bg = buffimg.getGraphics();
int[][] imgdata= getImagepix(Path);
for(int i=0;i<imgdata.length;i++) {
for(int j=0;j<imgdata[i].length;j++) {
Color color = new Color(imgdata[i][j]);
int red = color.getRed();
int blue = color.getBlue();
int green = color.getGreen();
int gray = (int) (0.299 * red + 0.587 * green + 0.114 * blue);
Color newcolor = new Color(gray,gray,gray);
bg.setColor(newcolor);
bg.drawLine(i,j,i,j);
}
}
bg.drawImage(buffimg,0,0,null);
马赛克
通俗来说,实现马赛克的方法就是如何将图像的一个像素点变成一个像素块,即将像素矩阵中的全部像素值统一修改为这个像素点矩阵中任意一个像素点值。本例中,我们将像素矩阵长度与宽度均设置为10,选取像素矩阵左上角的像素点值。
Graphics bg = buffimg.getGraphics();
int[][] imgdata = getImagepix(Path);
for(int i=0;i<imgdata.length;i=i+10) {
for(int j=0;j<imgdata[i].length;j=j+10) {
Color color = new Color(imgdata[i][j]);
int red = color.getRed();
int blue = color.getBlue();
int green = color.getGreen();
Color newcolor = new Color(red,green,blue);
bg.setColor(newcolor);
bg.fillRect(i,j,10,10);
buffimg