初识卷积在图像中的应用

最初了解到卷积是在信号与系统中,其定义是两个变量在某个范围内相乘得到是结果。

RGB数字图像可以看作是一个数值矩阵,也可以进行卷积操作,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。

用一张图片更容易说明这个过程:

不同的卷积核对图像卷积后的结果不同,卷积核一丁点的差异都会导致最后的卷积结果的天壤之别。

卷积核可以是3*3,也可以是3*5或5*5,具体看要实现的效果

常用的几个卷积核有:

边缘检测:[[1,0,-1],[0,0,0],[-1,0,1]];

锐化:[[0,-1,0],[-1,5,-1],[0,-1,0]];

实现简单图像卷积的思路:

将图像拆分为RGB矩阵,将RGB矩阵分别与卷积核进行卷积,对合成后的RGB值进行判断防止越界,然后利用卷积结果的RGB合成新图像。

具体实现的部分代码及效果:

 public void drawImage_09(int[][] imgarr, Graphics g) {
        double[][] kernel = {{-1, 0, 1}, {0, 0, 0}, {1, 0, -1}};
        //double[][] kernel = {{0, -1, 0}, {-1, 5, -1}, {0, -1, 0}};
        for (int i = 1; i < imgarr.length - 1; i++) {
            for (int j = 1; j < imgarr[i].length - 1; j++) {
                int rgb1 = imgarr[i-1][j-1];
                Color color1 = new Color(rgb1);
                int red1 = color1.getRed();
                int green1 =color1.getGreen();
                int blue1 = color1.getBlue();

                int rgb2 = imgarr[i-1][j];
                Color color2 = new Color(rgb2);
                int red2 = color2.getRed();
                int green2 =color2.getGreen();
                int blue2 = color2.getBlue();

                int rgb3 = imgarr[i-1][j+1];
                Color color3 = new Color(rgb3);
                int red3 = color3.getRed();
                int green3 = color3.getGreen();
                int blue3 = color3.getBlue();

                int rgb4 = imgarr[i][j-1];
                Color color4 = new Color(rgb4);
                int red4 = color4.getRed();
                int green4 =color4.getGreen();
                int blue4 = color4.getBlue();

                int rgb5 = imgarr[i][j];
                Color color5 = new Color(rgb5);
                int red5 = color5.getRed();
                int green5 =color5.getGreen();
                int blue5 = color5.getBlue();

                int rgb6 = imgarr[i][j+1];
                Color color6 = new Color(rgb6);
                int red6 = color6.getRed();
                int green6 =color6.getGreen();
                int blue6 = color6.getBlue();

                int rgb7 = imgarr[i+1][j-1];
                Color color7 = new Color(rgb7);
                int red7 = color7.getRed();
                int green7 =color7.getGreen();
                int blue7 = color7.getBlue();

                int rgb8 = imgarr[i+1][j];
                Color color8 = new Color(rgb8);
                int red8 = color8.getRed();
                int green8 =color8.getGreen();
                int blue8 = color8.getBlue();

                int rgb9 = imgarr[i+1][j+1];
                Color color9 = new Color(rgb9);
                int red9 = color9.getRed();
                int green9 =color9.getGreen();
                int blue9 = color9.getBlue();

                double nred = red1*kernel[0][0]+red2*kernel[0][1]+red3*kernel[0][2]
                        +red4*kernel[1][0]+red5*kernel[1][1]+red6*kernel[1][2]
                        +red7*kernel[2][0]+red8*kernel[2][1]+red9*kernel[2][2];
                if(nred<0){
                    nred = 0;
                }else if(nred>255){
                    nred = 255;
                }

                double ngreen = green1*kernel[0][0]+green2*kernel[0][1]+green3*kernel[0][2]
                        +green4*kernel[1][0]+green5*kernel[1][1]+green6*kernel[1][2]
                        +green7*kernel[2][0]+green8*kernel[2][1]+green9*kernel[2][2];
                if(ngreen<0){
                    ngreen = 0;
                }else if(ngreen>255){
                    ngreen = 255;
                }

                double nblue = blue1*kernel[0][0]+blue2*kernel[0][1]+blue3*kernel[0][2]
                        +blue4*kernel[1][0]+blue5*kernel[1][1]+blue6*kernel[1][2]
                        +blue7*kernel[2][0]+blue8*kernel[2][1]+blue9*kernel[2][2];

                if(nblue<0){
                    nblue = 0;
                }else if(nblue>255){
                    nblue = 255;
                }


                Color ncolor = new Color((int)nred,(int)ngreen,(int)nblue);
                g.setColor(ncolor);
                g.fillRect(X + i , Y + j , 1 , 1);

            }
        }
    }

运行结果:

边缘检测:

锐化:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值