通过掩膜实现图像对比度的提升
- 通过掩膜实现图像对比度提升
- 通过api实现图像的对比度提升
1、通过掩膜实现图像对比度提升
示例图像:
结果图像:
掩膜的大小:
代码实现:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//读取图像
Mat img = imread("G:/imgtest/label.png");
if (!img.data)
{
printf("this image cannot load");
return -1;
}
//显示图像
namedWindow("img", WINDOW_AUTOSIZE); //namedWindow创建的窗口,可以自动销毁
imshow("img", img);
//图像位深度
CV_Assert(img.depth() == CV_8U);
Mat resultimg = Mat::zeros(img.size(), img.type());
int nchannels = img.channels();
int rows = img.rows;
int cols = (img.cols - 1) * nchannels;
//行
for (int row = 1; row < rows-1; row++)
{
const uchar* previous = img.ptr<uchar>(row-1); //对应5上面的一行
const uchar* current = img.ptr<uchar>(row); //5所在的行
const uchar* next = img.ptr<uchar>(row+1); //5下面的一行
uchar* outputimg = resultimg.ptr<uchar>(row);
//列
for (int col = nchannels; col < cols-1; col++)
{
//根据上图公式计算掩膜
//saturate_cast用于确保图像的像素在0-255之间
outputimg[col] = saturate_cast(5*current[col] - (previous[col] + next[col] + current[col-nchannels] + current[col+nchannels]));
}
}
//显示结果图像
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", resultimg);
//保存图像
imwrite("G:/testimg/result.png", resultimg);
waitKey(0);
return 0;
}
2、通过OpenCV自带api进行对比度的提升
主要用到一下api:
filter2D(src, dst, src.depth(), kernel)
一个重要的函数:
saturate_cast():确保图像像素在0-255之间。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//读取图像
Mat img = imread("G:/imgtest/label.png");
if (!img.data)
{
printf("this image cannot load");
return -1;
}
//显示图像
namedWindow("img", WINDOW_AUTOSIZE); //namedWindow创建的窗口,可以自动销毁
imshow("img", img);
//图像位深度
CV_Assert(img.depth() == CV_8U);
Mat resultimg = Mat::zeros(img.size(), img.type());
//设置kernel,即为上图的3*3方块
Mat kernel = (Mat_<char>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
filter2D(img, resultimg, img.depth(), kernel);
imwrite("G:/testimg/reult.png", resultimg);
waitKey(0);
return 0;