图像处理(暑期第二次课)

图像处理

基础知识

  • 颜色 像素的原理
  • 如何读取一张图片到程序上来
  • 如何将读取到像素点绘制到界面上

界面开发

  • 动作监听器
  • 鼠标监听器

处理效果

  • 图像滤镜
  • 灰度 二值化 马赛克 油画 轮廓提取 去背景 融合虚化 提高亮度 磨皮
  • 镜像 缩小 放大
  • 卷积运算 高斯模糊 锐化 浮雕 特征放大
  • 二维码 生成 与 识别
  • 以图搜图 指纹 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)

任务

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值