open cv之图像矩阵的掩膜操作-对比度增强

使用open cv以来,一直对指针操作有点糊涂,不太明白。近来仔细研读了指针操作的相关文章,发现指针这个东西让很多人都头疼。你会用它时,也就那么回事,而当你不明不白,就会用的漏洞百出,很小的bug都困扰你半天,让人十分头疼。此为我练习写的小程序,也让我对指针有了更深层次的理解。

1.题目

在这里插入图片描述

2.代码部分

编译环境为vs2017+open cv 3.4.0,图片为RGB图像,来源网络。

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, char** grav) {
	Mat src = imread("C:\\Users\\Pictures\\Saved Pictures\\704-160P1221011.jpg");
	if (!src.data)
	{
		cout << "can not load the picture" << endl;
		return -1;
	}
//获取图像宽度、高度、通道数
	int cols = (src.cols-1)*src.channels();
	int rows = src.rows;
	int offsets = src.channels();

	//创建一个和原图像同样大小的图像,并把所有像素赋予0
	Mat dst=Mat::zeros(src.size(), src.type());
	

for (int row = 1; row < rows - 1; row++)//列数控制
{
	//获取三行像素
	const uchar* current = src.ptr<uchar>(row);
	const uchar* previous = src.ptr<uchar>(row - 1);
	const uchar* next = src.ptr<uchar>(row + 1);

	uchar* output = dst.ptr<uchar>(row);

	for (int col = offsets; col < cols; col++)
	{
		output[col] =saturate_cast<uchar>(5 * current[col] - (previous[col] + next[col] + current[col + offsets] + current[col - offsets]));

	}

}
imshow("【原图】",src);
imshow("【成果图】", dst);

//获取执行时间
double t = getTickCount();
double timecount = (getTickCount() - t) / getTickFrequency();
cout << "time cousume: " <<endl<<setprecision(5)<<timecount;

waitKey(0);
return 0;

}

3.效果图

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

4.注解

我们在计算过程中使用了“像素范围处理saturate_cast”函数限制其像素范围在0-255之间。而如果不用这个函数,就会出现很多不合理的像素。效果图如下:
在这里插入图片描述

5.api函数

整个掩膜处理过程可以用api函数filter2D实现。实现代码:

Mat kernal = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, dst, src.depth(), kernal)

效果题主已经测试,与我们之前的效果一样。

今天的已经完毕,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值