图像的卷积操作

图像的卷积操作原理:给定一个奇数尺寸大小的卷积核,对图像进行卷积操作。因为使用奇数尺寸大小的卷积核,其锚点正好在卷积核正中央的位置。如下图中间画了一个锚的就是锚点使锚点覆盖在待计算像素上面,然后计算像素值与被覆盖的卷积核中的值的乘积和。将这个和赋值给当前像素,这就是卷积的过程。公式如下所示此处会有一个问题,如果锚点落在第一个像素点(1,1)上,卷积核当中锚点左侧和上方的卷积值超出了图像的边界外…

大家好,又见面了,我是你们的朋友全栈君。

原理:

给定一个奇数尺寸大小的卷积核,对图像进行卷积操作。

因为使用奇数尺寸大小的卷积核,其锚点正好在卷积核正中央的位置。

如下图
在这里插入图片描述

中间画了一个锚的就是锚点

使锚点覆盖在待计算像素上面,然后计算像素值与被覆盖的卷积核中的值的乘积和。将这个和赋值给当前像素,这就是卷积的过程。

公式如下所示

在这里插入图片描述

此处会有一个问题,如果锚点落在第一个像素点(1,1)上,卷积核当中锚点左侧和上方的卷积值超出了图像的边界外,怎么处理?

这里使用最原始的办法,即将待处理的图片增加一圈边缘,这个边缘正好宽度正好是卷积核尺寸除以2再取整的值,这样一个图像就多了一圈像素值为0的黑框。

可以进行卷积操作了。

在opencv 的函数库当中,有filter2D这么个函数,咱们现在山寨他一个!

代码:

void Filter2D(const Mat &src, Mat &dst,int ksize,short *kernel)//参数分别为原始图像,目标图像,卷积核尺寸,卷积核,只读入16位图像哦! { 
     CV_Assert(ksize % 2 == 1); Mat tmp; int len = ksize / 2; tmp.create(Size(src.cols + len, src.rows + len), src.type());//添加边框 dst.create(Size(src.cols, src.rows), src.type()); int channel = src.channels(); uchar *ps = src.data; uchar *pt = tmp.data; for (int row = 0; row < tmp.rows; row++)//添加边框的过程 { 
     for (int col = 0; col < tmp.cols; col++) { 
     for (int c = 0; c < channel; c++) { 
     if (row >= len && row < tmp.rows - len && col >= len && col < tmp.cols - len) pt[(tmp.cols * row + col)*channel + c] = ps[(src.cols * (row - len) + col - len) * channel + c]; else pt[(tmp.cols * row + col)*channel + c] = 0; } } } uchar *pd = dst.data; pt = tmp.data; for (int row = len; row < tmp.rows - len; row++)//卷积的过程 { 
     for (int col = len; col < tmp.cols -len; col++) { 
     for (int c = 0; c < channel; c++) { 
     short t = 0; for (int x = -len; x <= len; x++) { 
     for (int y = -len; y <= len; y++) { 
     t += kernel[ (len+x) * ksize + y + len] * pt[((row + x) * tmp.cols + col + y) * channel + c]; } } pd[(dst.cols * (row - len) + col - len) * channel + c] = saturate_cast<ushort> (t);//防止数据溢出ushort是16为数据 } } } } int main() { 
     ios::sync_with_stdio(false); Mat src = imread("src.jpg"); Mat dst; short m[9] = { 
     0, -1, 0 ,-1,4,-1, 0 ,-1,0}; Filter2D(src, dst, 3, m); imshow("src", src); imshow("dst", dst); waitKey(); system("pause"); return 0; } 

结果:

src图像是
在这里插入图片描述

卷积后的图像
在这里插入图片描述

这里使用的卷积核是

[0,-1,0]
[-1,4,-1]
[0,-1,0]

使用python来执行同样的操作,结果是一样的哦!

import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('src.jpg') a=[ [0,-1,0], [-1,4,-1], [0,-1,0] ] kernel = np.array(a) dst = cv2.filter2D(img,-1,kernel) cv2.imshow('src',img) cv2.imshow("dst",dst) cv2.waitKey() 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140737.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • qmake中文官方文档

    qmake中文官方文档qmakeQMake提供了一个用于管理应用程序,库,其他组件的构建过程的面向工程系统QMake扩展了每个工程文件的信息,生成一个执行编译和连接过程的Makefile本文翻译自Qt4.8官方文档。一、QMake使用QMake提供了一个用于管理应用程序、库、其它组件的构建过程的面向工程系统。QMake扩展了每个工程文件的信息,生成一个执行编译和链接过程的必须命令的MakeFile。1、描述工程工程文件.pro描述了工程信息。工程文件信息会被qmake用于生成包含构建过程中所需的所有命令的Mak

    2022年5月19日
    40
  • 7000笔记本性价比之王(三千元笔记本性价比之王)

    PC市场的出货量频繁爆低,并不意味着这一市场走衰,其依旧是大部分人日常办公和外出携带办公所不可或缺的电子产品。只是换新欲望不强烈,面对并不了解的产品时过于保守的购买态度,严重影响了消费者在更换笔记本电脑的“快、准、狠”。但若真有购机需求时,看到各个价位的各种机型,又无从下手。说多了都是泪啊…哎…不容易~作为90后编辑和在大城市打拼的各位一样,就是个“小白领”。交了房租水电,买了油米泡面。发现,这个…

    2022年4月10日
    68
  • 补码运算的溢出_补码乘法溢出判断

    补码运算的溢出_补码乘法溢出判断补码运算-溢出和自然丢弃int:-32768——+32767最高位为符号位:0代表正,1代表负正数:补码,反码,原码相同负数:补码是正数取反加一32767的编码0111111111111111取反为1000000000000000再加1得到-32767的编码:1000000000000001-32768比32767还少1:自然就是:1000000000000000在原码运算时,首先要把符号与数值分开。例如两数相加,先要判断两数的符号,如果同号,可以做加法,如果异号,实际要做

    2022年9月22日
    0
  • spider crawled. red bottom shoes「建议收藏」

    Hewasamostnotoriousblasphemer,andhispoweroflanguagewassoextraordinarywhicheverybodyutilizedtod…

    2022年4月10日
    34
  • CultureInfo 类

    CultureInfo 类CultureInfo类 提供有关特定区域性的信息(如区域性的名称、书写系统和使用的日历)以及如何设置日期和排序字符串的格式。命名空间:System.Globalization程序集:mscorlib(在mscorlib.dll中)varExpCollDivStr=ExpCollDivStr;ExpCollDivStr=ExpCollDiv

    2022年6月19日
    25
  • openGL ES美颜滤镜之美白,磨皮,红润[通俗易懂]

    openGL ES美颜滤镜之美白,磨皮,红润[通俗易懂]下面是滤镜源码:importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.Bitmap;importandroid.opengl.GLES20;importandroid.opengl.GLSurfaceView;importandroid.opengl.Matrix;importandroid.view.WindowManager;importcom.ws.gl.o

    2022年7月22日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号