图像是由一个个像素点组合而成,图像处理本身实际上是遍历图像的像素点,对像素点的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 blocke.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.setRGB(i, j, newcolor.getRGB());}}bg.drawImage(buffimg,0,0,null);

油画

如果是马赛克是利用“画方块”的形式来绘制图像,那么油画就是通过“画圆”的方式。在进行油画处理的时候应该注意的是,“画圆”的半径一定要小于选取的像素矩阵的长度和宽度,否则绘制出来的图像会留白。

Graphics bg = buffimg.getGraphics();int[][] imgdata = getImagepix(Path);for(int i=1;i<imgdata.length;i=i+4) {for(int j=0;j<imgdata[i].length;j=j+4) {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.fillOval(i, j, 5, 5);}}bg.drawImage(buffimg,0,0,null);

二值化

顾名思义,二值化就是将图像的全部RGB值转化为两种。对图像进行灰度处理后,我们可以设置一个比较值,区别大于或小于比较值的RGB值。为如本例中将该比较值设置为170,当RGB大于170时赋值255,否则赋值0。

Graphics bg = buffimg.getGraphics();int[][] imgdata = getImagepix(Path);for(int i=1;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);if(gray>170) gray=255;else gray=0;Color newcolor = new Color(gray,gray,gray);buffimg.setRGB(i, j, newcolor.getRGB());}}bg.drawImage(buffimg,0,0,null);

浮雕

浮雕是利用卷积过滤器进行图像处理的实现类型之一。
在这里,我们选择的浮雕矩阵为{{-1,-1,0},{-1,0,1},{0,1,1}}。

Graphics bg = buffimg.getGraphics();int[][] imgdata = getImagepix(Path);int finalred=0;int finalblue=0;int finalgreen=0;Color[][] colors = new Color[imgdata.length][imgdata.length];int[][] red = new int[imgdata.length][imgdata.length];int[][] green = new int[imgdata.length][imgdata.length];int[][] blue = new int[imgdata.length][imgdata.length];for(int i=1;i<imgdata.length-1;i++) {for(int j=1;j<imgdata[i].length-1;j++) {colors[i-1][j-1] = new Color(imgdata[i-1][j-1]);colors[i-1][j] = new Color(imgdata[i-1][j]);colors[i-1][j+1] = new Color(imgdata[i-1][j+1]);colors[i][j-1] = new Color(imgdata[i][j-1]);colors[i][j] = new Color(imgdata[i][j]);colors[i][j+1] = new Color(imgdata[i][j+1]);colors[i+1][j-1] = new Color(imgdata[i+1][j-1]);colors[i+1][j] = new Color(imgdata[i+1][j]);colors[i+1][j+1] = new Color(imgdata[i+1][j+1]);for(int m=i-1;m<i+2;m++) {for(int n = j-1;n<j+2;n++) {red[m][n] = colors[m][n].getRed();green[m][n] = colors[m][n].getGreen();blue[m][n] = colors[m][n].getBlue();}}//浮雕矩阵int [][] maxtrix= {{-1,-1,0},{-1,0,1},{0,1,1}};for(int k=i-1;k<i+2;k++) {for(int l=j-1;l<j+2;l++) {finalred+=red[k][l]*maxtrix[k-(i-1)][l-(j-1)];finalblue+=red[k][l]*maxtrix[k-(i-1)][l-(j-1)];finalgreen+=red[k][l]*maxtrix[k-(i-1)][l-(j-1)];}}if(finalred<0) finalred=0;if(finalred>255) finalred=255;if(finalblue<0) finalblue=0;if(finalblue>255) finalblue=255;if(finalgreen<0) finalgreen=0;if(finalgreen>255) finalgreen=255;Color newcolor=new Color(finalred,finalgreen,finalblue);buffimg.setRGB(i, j, newcolor.getRGB());}}bg.drawImage(buffimg,0,0,null);

反向

对图像的RGB值进行反向处理,如

int red = 255-color.getRed();
int blue = 255-color.getBlue();
int green = 255-color.getGreen();
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 = 255-color.getRed();int blue = 255-color.getBlue();int green = 255-color.getGreen();Color newcolor = new Color(red,green,blue);buffimg.setRGB(i, j, newcolor.getRGB());}}

去色

将像素点的RGB值统一设置为其中的最大值

Graphics bg = buffimg.getGraphics();int[][] imgdata = getImagepix(Path);for(int i=1;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 avg = (Math.max(Math.max(red, blue),green)+Math.max(Math.min(red, blue),green))/2;Color newcolor = new Color(avg,avg,avg);buffimg.setRGB(i, j, newcolor.getRGB());}}bg.drawImage(buffimg,0,0,null);

怀旧

利用怀旧滤镜公式实现图像处理

Graphics bg = buffimg.getGraphics();int[][] imgdata = getImagepix(Path);for(int i=1;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[] rgb = new int[3];rgb[0]=(int) (0.393*red+0.769*green+0.189*blue);rgb[1] = (int) (0.349*red+0.686*green+0.168*blue);rgb[2] = (int) (0.272*red+0.534*green+0.131*blue);for(int m=0;m<3;m++) {if(rgb[m]<0)rgb[m]=0;else if(rgb[m]>255)rgb[m]=255;}Color newcolor = new Color(rgb[0],rgb[1],rgb[2]);buffimg.setRGB(i, j, newcolor.getRGB());}}bg.drawImage(buffimg,0,0,null);

放大镜

将“小圆”变成“大圆”,将某一像素点的圆形范围内的像素点扩大,实现放大效果

Graphics bg = buffimg.getGraphics();int[][] imgdata = getImagepix(Path);int[][] newimg = new int[imgdata.length][imgdata.length];int distance;int radius=50;int m=2;for(int i=0;i<imgdata.length;i++) {for(int j=0;j<imgdata[i].length;j++) {distance=(int) Math.sqrt(Math.pow(i-cenx, 2)+Math.pow(j-ceny, 2));if(distance<radius)newimg[i][j]=imgdata[(int)(i+cenx)/m][(int)(j+ceny)/m];else newimg[i][j]=imgdata[i][j];}}for(int i=0;i<newimg.length;i++) {for(int j=0;j<newimg[i].length;j++) {Color newcolor = new Color(newimg[i][j]);buffimg.setRGB(i, j, newcolor.getRGB());bg.drwaImage(buffimg,0,0,null);

Java图像处理:灰度、二值化、浮雕、去色、反向、怀旧、放大镜等相关推荐

  1. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  2. opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  3. 《图像处理》二值化和灰度化、透明度

    透明度 介绍: Color 类用于封装默认 sRGB 颜色空间中的颜色,或者用于封装由 ColorSpace 标识的任意颜色空间中的颜色.每种颜色都有一个隐式的 alpha 值 1.0,或者有一个在构 ...

  4. MATLAB图像处理之二值化以及灰度处理

    首先先来明白几个概念: 1.彩色图像(RGB):图像的每个像素点都是由红(R).绿(G).蓝(B)三个分量来表示的,每一个分量一般分别介于0-255之间,当然如果每一个颜色分量用更多的位数去表示的话, ...

  5. vc++数字图像处理 自适应二值化程序

    这段时间做图像处理,这是用迭代法求阈值的,自适应二值化代码,贴出来希望对大家有帮助 void GrayTrans::Binary() { long i,j; unsigned char pixel; ...

  6. 【Matlab 图像】灰度二值化处理

    灰度运算 grayimg = rgb2gray(flag_yellow); % 灰度图像 二值化运算 BWimg = im2bw(grayimg, 0.8); 自动化阈值 T = graythresh ...

  7. 图像处理之二值化图像

    图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果.将所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以 ...

  8. 【二维码识别】基于matlab GUI灰度+二值化+校正二维码生成与识别【含Matlab源码 635期】

    ⛄一.二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题.以QR码为代表的二维码,以其在信息存储.传输和识别技 ...

  9. 【二维码识别】灰度+二值化+校正二维码生成与识别【含GUI Matlab源码 635期】

    ⛄一.二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题.以QR码为代表的二维码,以其在信息存储.传输和识别技 ...

  10. 2021-08-09 图像灰度二值化

    from PIL import Image import matplotlib.pyplot as plt import numpy as np# 获取图片 def getimg():return I ...

最新文章

  1. 【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )
  2. 几种常用的配电网络接线
  3. React从入门到精通系列之(12)深入理解JSX
  4. 首次!海豚间像人类一样的交谈被水下麦克风记录
  5. Selector 实现原理
  6. android源码编译jar,在android源码编译中导入第三方jar包
  7. JS中的showModelDialog详解和实例
  8. Unity IOS 软键盘输入框问题
  9. 毕业论文word版 格式设置技巧
  10. [buuctf] crypto全解——85-120(不建议直接抄flag)
  11. Python求极限求积分,编程实现
  12. 23个无本空手套白狼的赚钱方法!颠…
  13. 高通骁龙450智能模块msm8953 android 4G
  14. 程序的优化 文字的减法
  15. 3500x架构_R5 3500X怎么样
  16. 利息积数的计算方法及应用
  17. android平台驱动开发(二)--设备属性节点的创建
  18. IDEA查看类UML图
  19. 服务器主机如何运行,局域网主机如何登录服务器的方法
  20. 以ZPW-2000为例的轨道移频电路原理

热门文章

  1. [转载]HAO123的迷思——谈谈SEO
  2. 加入收藏夹,设为首页代码
  3. 支持动态属性的标签库 [ 04-12-30 | 刘冬 ]
  4. python 爬取下一页_如何使用Beautifulsoup在python中抓取下一页
  5. vue3 + vite + ts + pinia + yarn
  6. C# Winform ToolStripContainer ToolStrip使用
  7. 这七个项目管理思维帮助你轻松带好项目
  8. 为什么月工资时间为21.75
  9. 利用结构体实现通讯录
  10. 学生健康信息填报系统