这是本人正式开始研究写的第一篇博客,本人是东北**大学本科计算机毕业,目前在DHU研究纺织图像识别等,目前在图像识别方向是小白一个,希望有志同道合的朋友一起讨论,一起进步,同时也为未来有这个方向的学者提供一些帮助。
获取图像像素指针等API
Mat.ptr<uchar>(int i=0); //获取像素矩阵的指针,索引i表示第几行,从0开始计数
const uchar *current = img.ptr<uchar>(row); //获取当前行指针
p(row,col) = current[col] //获取当前像素点像素值
saturate_cast<uchar>(); //像素范围处理,使像素规范处于0~255之间
img2 = Mat::zeros(img.size(), img,type());
//初始化数组 使得img2数组初始化为img数组一样的大小与类型
手动提高图片对比度公式是将一个像素点像素值*5然后减去4邻接的像素点像素值之和
公式表达:f(2,2)*5 - f(2,1) - f(2,3) - f(1,2) - f(1,3) ------------(f(x,y)操作是取像素值操作)
代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main() {
Mat src, dst;
src = imread("C:/PICTURES/soul.jpg");
if (!src.data) {
printf("找不到图片\n");
return -1;
}
namedWindow("tupian", WINDOW_AUTOSIZE);
imshow("tupian", src);
int cols = (src.cols-1) * src.channels(); //取总列数
int offset = 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 = offset; col < cols; col++)
//cols也是从0起始,这里给col赋初值channels等同于让遍历从第二个像素点开始,也就是第四
//列,前三列分别是第一个像素的BGR
{
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offset] + current[col + offset] + previous[col] + next[col])); //current[*]是取这一点像素值
}
}
namedWindow("增强对比度", WINDOW_AUTOSIZE);
imshow("增强对比度", dst);
waitKey(0);
return 0;
}
这边实现的就是手动的掩膜操作来实现对比度的提高,但其实opencv里已经有这个API了,我们手动敲可以体会一下深层次的代码运行。
kernel = (Mat_char(3,3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
filter2D(src, dst,src.depth(), kernel);