图像处理
基础知识
- 颜色 像素的原理
- 如何读取一张图片到程序上来
- 如何将读取到像素点绘制到界面上
界面开发
- 动作监听器
- 鼠标监听器
处理效果
- 图像滤镜
- 灰度 二值化 马赛克 油画 轮廓提取 去背景 融合虚化 提高亮度 磨皮
- 镜像 缩小 放大
- 卷积运算 高斯模糊 锐化 浮雕 特征放大
- 二维码 生成 与 识别
- 以图搜图 指纹 hash
添加摄像头
-视频处理
-多像头
-仿ps 画笔效果
-保存处理之后的结果
图像原理
-
像素点矩阵
- 像素点(R,G,B)
- 屏幕:三颜色二极管组成 RGB(红绿蓝)
- RGB的取值范围 0-255 256阶 三个都调到255 255 255就是白色
-
图片:矩阵组成
-
(R,G,B),(R,G,B),(R,G,B),(R,G,B)
-
(R,G,B),(R,G,B),(R,G,B),(R,G,B)
-
(R,G,B),(R,G,B),(R,G,B),(R,G,B)
-
(R,G,B),(R,G,B),(R,G,B),(R,G,B)
-
(R,G,B),(R,G,B),(R,G,B),(R,G,B)
全部是0 就是一张黑色的图片
全部是255就是一张白色的图片 -
程序中存储图片
- 0-255 一个字节byte
- byte: 8 bit
- 白色 255 255 255
- 1111 1111 1111 1111 1111 1111 计算机专用计算器
-
int 32bit
- 0000 0000 0000 0000 0000 0000 0000
-
A RED GREEN BLUE
-
如何将三个0-255 RGB值存入一个人int中表达
-
如何将一个int中存储的RGB拆分开
位运算
-计算机中效率最高的一种计算方式
-
直接操作这个数的二进制码
-
位移运算
- 向右移:>>
- 向左移:<<
- 1280>>1=?
- 2>>1
- 0010>>1=0001=1
- 1111>>1=01111=7
-
Test
- 0000 0000 0110 0111 1010 1111 1111 0010
- red 0110 0111=103
- green 1010 1111 =175
- blue 0110 0111 =242
代码计算为宜
import java.sql.SQLOutput;
public class zyf0821 {
public static void main(String[] args){
int num = 16_777_215;
//使用位移运算操作
int red = (num >> 16)&255(//255另一种表达方式0*FF //一个F代表1111);
//红色前面没有数,都是0,不需要加。
System.out.println (red);
int green = (num >> 8)&255;
System.out.println(green);
int blue = (num >> 0)&255;
System.out.println(blue);
}
}
将一个整数值拆分为二进制码 算出的结果为
& 运算 相同保留原码 不同为0
0000 0000 0110 0111 1010 1111 1111 0010 &
0000 0000 0000 0000 0000 0000 1111 1111 (255 )=
0000 0000 0000 0000 0000 0000 1111 0010
如何去画一张图片
第一步 先建立一个框架
package wcc.wcc0703.imagepro;
import javax.swing.*;
import java.awt.*;
public class ImpagePad extends JFrame {
public void showIniUI(){
setTitle("图像处理");
setSize(800,600);
setVisible(true);
}
// 第二个paint方法
@Override
public void paint(Graphics g) {
super.paint(g);
}
//第三个 主函数
public static void main (String []args){
new imagePad = new ImpagePad();
new ImagePad showInitUI () ;
}
}
如何读取一张图片
第一部分
第一步
单独写一个方法
图片在一个计算机上面都是一个字符串提取上面
public void getImagePixelsArray(String path){
第二步
将一张图片转为整数型像素点的矩阵(存的不是RGB,而是数据)
相关代码
public int[][] getImagePixelsArray(String path){
File file = new File(path);
BufferedImage buffing =null;
try{
buffimg = ImageIO.read (file);
} catch (IOException e){
throw new RuntimeException(e);
}
int width = buffimg.getWidth();
int heightt = buffing.getHeight();
int[][] imgArray = new int[width][height];
for (int i =0; i< width,i++){
for(int j = 0; j < width; j++){
imgArray[i][j]=buffimg.getRGB(i,j);//寸buffing image 取出来的像素值
}
}
return imgArray;
//第三个 主函数
public static void main (String []args){
new imagePad = new ImpagePad();
new ImagePad showInitUI () ;
}
}
第三步
用return的方式返回
public int[][] getImagePixelsArray(String path){
第四步
把这个方法拿到这里来用
加入int[][]…
把图片的相对路径复制到
文件夹的名字/图片名字.图片格式
第二部分
遍历数组
迭代嵌套循环
-
定义一个像素值=从数组中取出来的值(在这里我们会把每一个像素值都取出来拆为RGB上的值)
-
再经过处理
-
合成颜色
-
设置给画笔
-
绘制一个点 坐标为i j
-
最后run一下
用途:从像素级别改变,可以做一下滤镜
@Override
public void paint(Graphics g) {
super.paint(g);
int[][] imgArr = getImagePixelsArry (srcsg/img.png);
//遍历数组
for ( int i=0; i<imaArr[i].length;
//取出每一个像素值
int pixum=imgArr[i][j];
//拆为RGB 三个值
int red = (pixnum>>16)&255;
int green =(pixnum>>8)&255;
int blue = (pixnum>>0);255;//0可以不写
//处理
int newred = red/2;
//合成颜色
Color color = new Color (newRed,green,blue);
//设置画笔
g.setColor(color);
//绘制一个点 坐标为 i j
g.fillRect(i,j,1,1)