图像的卷积操作

图像的卷积操作原理:给定一个奇数尺寸大小的卷积核,对图像进行卷积操作。因为使用奇数尺寸大小的卷积核,其锚点正好在卷积核正中央的位置。如下图中间画了一个锚的就是锚点使锚点覆盖在待计算像素上面,然后计算像素值与被覆盖的卷积核中的值的乘积和。将这个和赋值给当前像素,这就是卷积的过程。公式如下所示此处会有一个问题,如果锚点落在第一个像素点(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 伊甸园_绿田园农业

    伊甸园_绿田园农业近日,经国务院批复,《全国高标准农田建设规划(2021-2030年)》(以下简称《规划》)正式印发实施。《规划》指出,到2035年,通过持续改造提升,全国高标准农田保有量和质量进一步提高,绿色农田、数字农田建设模式进一步普及,支撑粮食生产和重要农产品供给能力进一步提升,形成更高层次、更有效率、更可持续的国家粮食安全保障基础。《规划》要求利用数字技术,推动农田建设、生产、管护相融合,提高全要素生产效率。重点推进物联网、大数据、移动互联网、智能控制、卫星定位等信息技术在农田建设中的应用,配套耕地质量综合监测点

    2022年10月21日
    3
  • JavaBean的作用「建议收藏」

    JavaBean的作用「建议收藏」javaBean 编辑JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,long和class方法获取。众所周知,属性名称符合这种模式,其他Java类可以通过自省机制发现和操作这些JavaBean的属性。javaBean在MVC设计…

    2022年7月17日
    12
  • 字符串截取substring方法

    字符串截取substring方法今天截取字符串截取多一个,研究了一下我们吧电话号为字符串开始截取错误示范Stringtel=”159-4322-1515″;intindex=tel.indexOf(“-“);//3intlastIndex=tel.lastIndexOf(“-“);//8Strings=tel.substring(0,index);//159Strings1=tel.substring(index

    2022年5月15日
    36
  • PHP表单验证

    PHP表单验证这里将介绍如何使用 PHP 验证客户端提交的表单数据 在处理 PHP 表单时需要考虑安全性 这里将展示 PHP 表单数据安全处理 为防止黑客以及垃圾信息就需要对表单进行数据安全验证 实例介绍的 HTML 表单中包含以下输入字段 必须与可选文本字段 单选按钮 及提交按钮 form verify php lt html gt lt head gt lt metacharset utf 8 gt amp l

    2025年11月26日
    8
  • 极大似然估计和贝叶斯估计的联系(似然估计和最大似然估计)

    1.什么是参数在机器学习中,我们经常使用一个模型来描述生成观察数据的过程。例如,我们可以使用一个随机森林模型来分类客户是否会取消订阅服务(称为流失建模),或者我们可以用线性模型根据公司的广告支出来预测公司的收入(这是一个线性回归的例子)。每个模型都包含自己的一组参数,这些参数最终定义了模型本身。我们可以把线性模型写成y=mx+c的形式。在广告预测收入的例子中,x可以表示广告支…

    2022年4月9日
    99
  • windows安装kafka教程

    windows安装kafka教程1、官网下载kafka【解压之后如图所示】2、修改zookeeper的配置文件dataDir=D:/zookeeper/datadataLogDir=D:/zookeeper/log3、启动zookeepercdD:\software\kafka\kafka_2.11-2.2.0\bin\windows在此目录下打开cmd,执行命令zookeeper-server…

    2022年10月16日
    4

发表回复

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

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