(02)矩阵的掩膜操作--提高图像的对比度


#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv)
{
	Mat src, dst;
	src = imread("D:/A_Graduation/picture/Fusion/source17_1.tif");
	if (!src.data) //如果数据没有加载进来即图片没有加载进来
	{
		printf("Could not load image...\n");
		return -1;
	}

	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src); 
	
	/*
	获取图像像素指针
	CV_Assert(myImage.depth()==CV_8U)
	Mat.ptr<uchar>(int i=0)获取像素矩阵的指针, 索引i表示第几行,从0开始记行数
	获得当前行指针const uchar* cuttrent = 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之间
	*/
	/*
	矩阵的掩膜操作, 根据掩膜来计算来重新计算像素的像素值
	公式:I(i. j) = 5 * I(i, j) - I(i-1, j) - I(i+1, j) - I(i, j-1) - I(i, j+1)
	首先获取图像的高度和宽度
	宽度:读进来的是RGB图像,RGB图像它有三个通道的值, 所以每一个clo它还有三个值
	所以它实际的clo的长度应该等于我们图像的clos乘以我们图像的通道数,
	src.cols图像的宽度,src.channels图像的通道数int cols = src.cols * src.channels()
	*/
	/*int cols = (src.cols-1) * src.channels(); //这个才是我们真实的有了多少通道

	int rows = src.rows;	//高度
	int offsetx = src.channels();  //开始的像素
	dst = Mat::zeros(src.size(), src.type());//初始化dst,类型和大小与输入图像一致,
	//把它全部变成零(就是黑色背景的空白图像【纯黑:RGB(0,0,0);纯白:RGB(255, 255, 255)】), 然后去获取这个,然后改变这个值,得到最后的dst
	//(1,1)才是它完全重合的像素,要排除最左上角的像素, 所以我们从(1, 1)开始
	//既然高度减去了1,忽略了那个像素,那宽度也要忽略掉那个像素
	for (int row = 1; row < (rows - 1); row++) //rows-1是最后一行也忽略,因为最后一行也不重合
	{
		//在这里要获取每一个通道对应的指针
		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 = offsetx; col < cols; col++)
		{
			//按照公式来,因为是三通道,所以下一个像素应该减3, saturate_cast<uchar>让像素值在0-255直接,就不会出现麻点那样了
			output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
		}
	}
	*/
	
	
	//与以上相同效果的API的用法:filter2D
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); //定义掩膜
	/*
	cv::getTickCount()可以用来测量一段代码的运行时间,这个函数返回从上次开机算起的时钟周期数。
	由于我们需要的是某个代码段运行的毫秒数,因此还需要另一个函数cv::getTickFrequency()。此函数返回每秒内时钟的周期数。
	*/
	double t = getTickCount(); //获取当前时间

	filter2D(src, dst, src.depth(), kernel); //其中src与dst是Mat类型变量、src.depth表示位图深度(这里是原图像的深度等同于-1),有32、24、8等
	
	double timeconsume = (getTickCount() - t) / getTickFrequency(); //计算消耗的时间
	printf("time: %.4f\n", timeconsume);

	//把最终的图片结果显示处理
	namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
	imshow("contrast image demo", dst);

	waitKey(0);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值