opencv卷积运算函数filter2D

函数介绍:
saturate_cast      处理数值的溢出问题

参数:要处理的数据类型

cv::saturate_cast<uchar>      这里将数据处理成uchar类型   小于0返回0    大于255返回255    0<=参数<=255返回参数

 

#include "CMainWindow.h"
#include <QMessageBox>
#include <QPushButton>
#include <opencv2/opencv.hpp>

CMainWindow::CMainWindow(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	QPushButton* pButton = new QPushButton(ui.centralWidget);
	pButton->setText(QString::fromLocal8Bit("加载图片"));
	connect(pButton, &QPushButton::clicked, this, &CMainWindow::onBtnClick);
}

void CMainWindow::onBtnClick()
{
	//读取图像
	cv::Mat imageSrc = cv::imread("G:/Saved Pictures/6306b8677191b8b0267fb566.jpg");

	if (imageSrc.empty())
	{
		QMessageBox::information(this, "error", "load image error");
		return;
	}
	cv::imshow("src image", imageSrc);

	cv::Mat imageDst(imageSrc.size(), imageSrc.type());
	//增强图像的模版
	cv::Mat kernel = (cv::Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	//进行卷积运算
	cv::filter2D(imageSrc, imageDst, imageSrc.depth(), kernel);
	cv::imshow("dest image", imageDst);

	//自己实现
	//mat存储的列数      rgb为例   一个图像的像素为 imageSrc.rows * imageSrc.cols  一个像素点由rgb三个255组成
	int nCols = imageSrc.cols * imageSrc.channels();
	//mat存储的行数
	int nRows = imageSrc.rows;
	cv::Mat myMat = cv::Mat::zeros(imageSrc.size(), imageSrc.type());
	int nOffsetX = imageSrc.channels();
	//从第2行开始 循环到倒数第二行
	for (int nRow = 1; nRow < nRows - 1; nRow++)
	{
		//获取上一行的指针
		const uchar* pPrev = imageSrc.ptr<uchar>(nRow - 1);
		//当前行的指针
		const uchar* pCur = imageSrc.ptr<uchar>(nRow);
		//下一行的指针
		const uchar* pNext = imageSrc.ptr<uchar>(nRow + 1);
		//保存到新的Mat中
		uchar* pOut = myMat.ptr<uchar>(nRow);
		for (int nCol = imageSrc.channels(); nCol < nCols; nCol++)
		{
			pOut[nCol] = cv::saturate_cast<uchar>(5 * pCur[nCol] - (pCur[nCol - nOffsetX] + pCur[nCol + nOffsetX] + pPrev[nCol] + pNext[nCol]));
		}
	}
	cv::imshow("my image", myMat);
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值