图像的卷积操作

图像的卷积操作原理:给定一个奇数尺寸大小的卷积核,对图像进行卷积操作。因为使用奇数尺寸大小的卷积核,其锚点正好在卷积核正中央的位置。如下图中间画了一个锚的就是锚点使锚点覆盖在待计算像素上面,然后计算像素值与被覆盖的卷积核中的值的乘积和。将这个和赋值给当前像素,这就是卷积的过程。公式如下所示此处会有一个问题,如果锚点落在第一个像素点(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() 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • freemarker菜鸟教程_freemarker自定义标签

    freemarker菜鸟教程_freemarker自定义标签使用的环境为SpringMVC+FreeMarker,要在ftl页面中使用contextPath,需要在viewResolver中做如下配置(红色部分):这样,在页面中使用${rc.contextPath}就可获得contextPath

  • ubuntu nginx安装配置_PHP开发环境搭建步骤

    ubuntu nginx安装配置_PHP开发环境搭建步骤一、说明正在尝试基于nginx+php搭建web服务器,中途遇到不少问题。挣扎了三四个小时终于完成了,这里分享下经验。实验环境操作系统:Ubuntu18.0464位nginx:1.14.0php:7.2.17-0php-fram:php7.2-fpm二、实验步骤1、安装必要程序以及依赖#安装程序包sudoapt-getinstallphp7.2…

  • Android中构建数据业务应用

    Android中构建数据业务应用

  • 数据库设计——关系数据理论(超详细)「建议收藏」

    数据库设计——关系数据理论(超详细)「建议收藏」问题——什么是一个好的数据库逻辑设计●关系型数据库逻辑设计:➠针对一个具体问题应如何构造一个适合于它的数据模式,即应构造几个关系,每个关系由哪些属性组成等eg:?这样的设计是一个好的设计吗?观察这个表所对应的一个实例(在某个时刻student模式所对应的一个实际的数据情况):如有若干个学生,他们都为’计算机系’,系主任为’张明’,选修了’C1’课程,得到各自的成绩☟☞关系模式STUDENT(Sno,Sdept,Mname,Cno,Grade)中存在的问题:☜1、数据冗余太大,浪费存储空间如

  • springWeb实战

    springWeb实战springWeb实战

  • 浦发银行 信息科技岗 大数据方向 面经

    浦发银行 信息科技岗 大数据方向 面经浦发银行总行信息科技部(大数据方向)面试浦发银行总行信息科技部(大数据方向)面试8.6面试大家的面经浦发银行总行(上海)大数据岗8月6号面经一、综合面二、机试三、专业面试浦发面经即兴演讲上机测试结构化面试浦发银行大数据创新岗上海打卡第一部分综合面试第二部分专业面试第三部分上机考试(只有开发和测试岗需要,别的岗可选)浦发总行信息岗校招面经(上海…

发表回复

您的电子邮箱地址不会被公开。

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