大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

所有文章
大宇私人伊甸园: 首页 > 所有文章 > 编程人生 > 开源库 > opencv > [001.03]矩阵的掩膜操作

[001.03]矩阵的掩膜操作

发布时间:2018/07/10 opencv 标签opencv掩膜操作矩阵阅读:72

前言:

最近发现一个能锐化图片的算法,同时借助同事“帅照”来实验一下。

内容:

先把之前的框架搭建起来,我同事的照片已经静静躺在我的D盘路径下面:test.jpg

#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main(int argc, char** args) {
	Mat image = imread("d:/test.jpg");
	if (image.empty()) {
		cout << "could not find the image resource..." << std::endl;
		return -1;
	}
	namedWindow("My Image", CV_WINDOW_AUTOSIZE);
	imshow("My Image", image);
	waitKey(0);

	return 0;
}

效果图:

我也觉得一个人能把照片拍这么大也是要一定的勇气。

但刚好,他的照片特别模糊,很符合我的样品照片要求,就是太大了。

其他必备知识:

获取图像像素指针:

CV_Assert(myImage.depth() == CV_8U);

Mat.ptr<uchar>(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。

获得当前行指针const uchar*  current= myImage.ptr<uchar>(row );

获取当前像素点P(row, col)的像素值 p(row, col) =current[col]

像素范围处理saturate_cast<uchar>:

saturate_cast<uchar>(-100),返回 0。

saturate_cast<uchar>(288),返回255

saturate_cast<uchar>(100),返回100

这个函数的功能是确保RGB值得范围在0~255之间

掩膜操作实现图像对比度调整:

红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作。

得到最终结果就是对比度提高之后的输出图像Mat对象

函数调用filter2D功能:

实际上opencv早就已经给我们实现了掩膜操作的函数算法:

定义掩膜:Mat kernel = (Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

filter2D( src, dst, src.depth(), kernel );其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。

源代码:

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

using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/test.jpg");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	/*
	int cols = (src.cols-1) * src.channels();
	int offsetx = src.channels();
	int rows = src.rows;

	dst = Mat::zeros(src.size(), src.type());
	for (int row = 1; row < (rows - 1); row++) {
	const uchar* previous = src.ptr<uchar>(row - 1);
	const uchar* current = src.ptr<uchar>(row);
	const uchar* next = src.ptr<uchar>(row + 1);
	uchar* output = dst.ptr<uchar>(row);
	for (int col = offsetx; col < cols; col++) {
	output[col] = saturate_cast<uchar>(5 * current[col] - (current[col- offsetx] + current[col+ offsetx] + previous[col] + next[col]));
	}
	}
	*/
	double t = getTickCount();
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, dst, src.depth(), kernel);
	double timeconsume = (getTickCount() - t) / getTickFrequency();
	printf("tim consume %.2f\n", timeconsume);

	namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
	imshow("contrast image demo", dst);

	waitKey(0);
	return 0;
}

因为他的图片太大了,要放大看才能看出效果,实际上用于越小的头像图片越有效果。

下面是一张成功的效果图:

The bottom line, for me, is simple.

Let’s hope it doesn’t take 500 years for a discipline of testing to becomes the standard for software developers.

From:dayu
相关推荐

您好!请登录

合作网站快捷登录:
点击取消回复

已有1评论

    大宇博客

    点击这里给我发消息点击这里给我发消息