标签:wim 指针 有一个 opencv2 auto http argv win wait
【目的】:图像掩膜的目的很单纯,亮的地方变亮一些,暗的地方变暗一些,公式如下
其实这个公式没什么意思,如果你有好的idea也可以,我们每次定位到中心5的那个地方,乘上5倍,然后减掉周围的像素值,举一个例子,中心是10,上下左右分别是20,30,40,50,你应用公式之后得到的是一个负值,这个时候有一个opencv的函数saturate_cast<uchar>如果你的值是负的他会映射到0,0---255之间保持不变,大于255映射到255,然后他会映射到0,这样那个像素点就变得更暗了,代码实现如下(采用普遍方法):
#include <iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat image = imread("timg2.jpg");//打开图像的Mat对象 Mat newimage(image.size(), image.type()); Mat kern = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//掩膜数组 int chan = image.channels();//代表图片的通道数,一般灰色图是单通道 int row = image.rows;//图像矩阵的行数 int cols = (image.cols - 1) * image.channels();//图像矩阵的列数,假设他是单通道,对于这个时候公式仍然成立 //所以换成多通道的时候等价于对每一个通道进行操作,一般灰色有一个通道,彩色有三个通道RGB,更甚者还可以 //加上一个透明颜色的通道 for (int i = 1; i < (row - 1); i++) { //创建像素指针 const uchar* prev = image.ptr(i);//中心的部分 const uchar* prew = image.ptr(i - 1); const uchar* pres = image.ptr(i + 1); uchar* output = newimage.ptr<uchar>(i); for (int j = chan; j < cols; j++) { output[j] = saturate_cast<uchar>(5*prev[j] - (prev[j - chan] + prev[j + chan] + prew[j] + pres[j])); } } if (!image.data) { cout << "图片打开失败" << endl; return -1; } Mat array = (Mat_<uchar>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(image,newimage,image.depth(),array); imwrite("text.jpg", newimage); namedWindow("IMAGE", CV_WINDOW_AUTOSIZE); imshow("IMAGE", image); namedWindow("IMAGE2", CV_WINDOW_AUTOSIZE); imshow("IMAGE2", newimage); waitKey(0); return 0; }
处理完图片的结果:
虽然处理完之后图像更差强人意了,但是对比度提高了不少
标签:wim 指针 有一个 opencv2 auto http argv win wait
原文地址:https://www.cnblogs.com/dfxdd/p/12272665.html