您的位置:首页 > 运维架构

OPenCV3.2 图像反差的两种方法

2017-10-04 20:52 148 查看
 反差图像就是用原图像素所能表达的最大像素值减去原图像素值之后所形成的图像。由于本程序采用的是Vec3b和uchar类型的图像,所以每通道的最大值为255,255 - 原值 = 反差值。

在本程序中,将采用两种方法实现反差图像,一种是用Mat对象中的at函数来遍历每一个像素,采用“255-原值= 反差值”公式实现,另一种直接使用bitwise_not函数实现。
具体实现代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char**argv)
{
//读入原图
Mat src = imread("1.jpg",0);//第二个参数:<0 表示加载原图,不做任何改变;
//=0表示把原图作为灰度图像加载进来; (>0) 表示把原图作为RGB图像加载进来
if (src.empty())
{
cout << "could not load image" << endl;
return -1;
}
namedWindow("source image", CV_WINDOW_AUTOSIZE);
imshow("source image", src);
//参数准备
Mat dst_at;
dst_at.create(src.size(), src.type());//存放反差之后的图像
int cols = src.cols;
int rows = src.rows;
int cn = src.channels();
/*namedWindow("gray", CV_WINDOW_AUTOSIZE);
imshow("gray", src);*/
//利用at函数遍历图像,进行图像反差处理
for (int row = 0; row < rows; row++){
for (int col = 0; col < cols; col++)
{
if(cn == 1){
int gray = src.at<uchar>(row, col);
dst_at.at<uchar>(row, col) = 255 - gray;
}
else if (cn == 3){
int b = src.at<Vec3b>(row, col)[0];
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
dst_at.at<Vec3b>(row, col)[0] = 255 - b;
dst_at.at<Vec3b>(row, col)[1] = 255 - b;
dst_at.at<Vec3b>(row, col)[2] = 255 - b;
}
}
}
namedWindow("dst_at_invert", CV_WINDOW_AUTOSIZE);
imshow("dst_at_invert", dst_at);
//利用bitwise_not函数,反差处理
Mat dst_bit(src.size(),src.type());
bitwise_not(src, dst_bit);
namedWindow("dst_bit", CV_WINDOW_AUTOSIZE);
imshow("dst_bit", dst_bit);
waitKey(0);
return 0;
}运行结果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OPenCV3.2 图像反差