#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;
}
(02)矩阵的掩膜操作--提高图像的对比度
最新推荐文章于 2022-01-28 15:29:18 发布