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;
}运行结果:
在本程序中,将采用两种方法实现反差图像,一种是用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;
}运行结果:
相关文章推荐
- opencv获取图像RGB值的两种方法
- 【opencv】 改变图像的对比度和亮度的两种方法
- C# OpenCV学习笔记二之图像读写的两种方法
- OPENCV+MFC单文档显示图像的两种方法
- OpenCV2学习笔记(四):两种图像分割方法比较
- 【MFC两种视频图像採集方法】DirectShow与Opencv
- 【MFC两种视频图像采集方法】DirectShow与Opencv
- Opencv 基础学习三 (OpenCV实现图像合并主要有两种方法)
- 【OpenCV学习笔记 023】两种图像分割方法比较
- opencv获取图像像素值的两种方法
- openCV中访问图像像素的两种方法
- 使用PHP生成二维码的两种方法(带logo图像)
- opencv截取图像中某一区域的方法
- opencv内存总结和访问图像中像素方法案例(指针方法)
- OpenCV改变图像大小的操作,resize与图像金字塔方法
- 简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT
- Qt5下实现摄像头预览及捕获图像方法二(openCV3与Qt5交互使用)
- 访问图像内像素的两种常用方法
- MATLAB实现批量处理图像图片的两种方法
- C++读取图像的RGB值(两种方法,均经过测试)