C++实现卷积操作

C++实现卷积操作卷积操作的C++实现#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/core/core.hpp>usingnamespacestd;usingnamespacecv;MatKernel_test_3_3=(…

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

卷积操作的C++实现

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

using namespace  std;
using namespace  cv;

Mat Kernel_test_3_3 = (
	Mat_<double>(3, 3) <<
	0, -1, 0,
	-1, 5, -1,
	0, -1, 0);
void Convlution(Mat  InputImage, Mat  OutputImage, Mat kernel)
{
	//计算卷积核的半径
	int sub_x = kernel.cols / 2;
	int sub_y = kernel.rows / 2;
	//遍历图片  
	for (int image_y = 0; image_y < InputImage.rows - 2 * sub_y; image_y++)
	{
		for (int image_x = 0; image_x < InputImage.cols - 2 * sub_x; image_x++)
		{
			int pix_value = 0;
			for (int kernel_y = 0; kernel_y < kernel.rows; kernel_y++)
			{
				for (int kernel_x = 0; kernel_x < kernel.cols; kernel_x++)
				{
					double  weihgt = kernel.at<double>(kernel_y, kernel_x);
					int value = (int)InputImage.at<uchar>(image_y + kernel_y, image_x + kernel_x);
					pix_value += weihgt*value;
				}
			}
			OutputImage.at<uchar>(image_y + sub_y, image_x + sub_x) = (uchar)pix_value;
		}
	}
}

int main()
{
	Mat srcImage = imread("1.jpg", 0);
	namedWindow("srcImage", WINDOW_AUTOSIZE);
	imshow("原图", srcImage);

	//filter2D卷积
	Mat dstImage_oprncv(srcImage.rows, srcImage.cols, CV_8UC1, Scalar(0));;
	filter2D(srcImage, dstImage_oprncv, srcImage.depth(), Kernel_test_3_3);
	imshow("filter2D卷积图", dstImage_oprncv);
	imwrite("1.jpg", dstImage_oprncv);

	//自定义卷积
	Mat dstImage_mycov(srcImage.rows, srcImage.cols, CV_8UC1, Scalar(0));
	Convlution(srcImage, dstImage_mycov, Kernel_test_3_3);
	imshow("卷积图3", dstImage_mycov);
	imwrite("2.jpg", dstImage_mycov);

	waitKey(0);
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • angular子组件传值到父组件_vue子组件传值给父组件

    angular子组件传值到父组件_vue子组件传值给父组件angular子组件传值给父组件step1: D:\vue\untitled2901\src\app\app.component.tsimport{Component}from’@angular/core’;@Component({selector:’app-root’,template:`Message:{{message}}<app-child(messageEvent)=”receiveMessage($event)”></app

    2025年9月15日
    8
  • 打开浏览器访问 www.baidu.com 获取到结果,整个流程

    打开浏览器访问 www.baidu.com 获取到结果,整个流程

    2021年11月11日
    58
  • 如何关闭ESLint,一次成功

    如何关闭ESLint,一次成功ESLint可以用来识别ECMAScript,并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。但是有时候新手会被ESLint的报错阻止程序的运行,这时候我们就想关闭这个ESLint了。vue项目中关闭ESLint方法:找到build文件夹—>webpack.base.conf.js—->module然后重启服务,npmrundev就可以…

    2022年5月5日
    246
  • 存储过程基础知识

    什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句。http://hovertree.com/h/

    2021年12月23日
    43
  • 各种常用不等式汇总「建议收藏」

    各种常用不等式汇总「建议收藏」对数学中常用的不等式进行了汇总,目前只有结论,没有证明

    2025年11月13日
    4
  • 自动编码器(Autoencoder)

    自动编码器(Autoencoder)autoencoder是一种无监督的学习算法。在深度学习中,autoencoder用于在训练阶段开始前,确定权重矩阵WW的初始值。神经网络中的权重矩阵WW可看作是对输入的数据进行特征转换,即先将数据编码为另一种形式,然后在此基础上进行一系列学习。然而,在对权重初始化时,我们并不知道初始的权重值在训练时会起到怎样的作用,也不知道在训练过程中权重会怎样的变化。因此一种较好的思

    2022年6月10日
    30

发表回复

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

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