循序渐进之(一)空间域图像增强之基本灰度变换
基本想法是在冈萨雷斯第二版《数字图像处理》的指导结构下,用opencv与c++循序渐进。
图像增强概览:图来自于图像增强之局部增强(更新中)。
这一节是3.2章节的内容,图像增强中的空域中的图像灰度变换,简单解释是怎样将现有图像处理成更有利于人们和机器理解的方式和样式。主要有图像反转、对数变换、幂次变换等,主要就是在单个像素的层面上对于图像进行操作,原理大同小异,算法不同就是对于单个像素操作的数学公式不同。
以下为图像反转代码:
#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat a = imread("E:\\33.jpg");
if (!a.data)
{
cout << "Please check out this image,make sure it exits";
waitKey();
}
imshow("原图", a);
/*①第一种方法,一开始没找到怎样将RGB三通道图变成单通道的方法,所以比较笨的将RGB变成每个通道数值都相等的三通道图,然后split一路出来。。。
Mat b(a.size(),CV_8UC3);
for (int i = 0; i < a.rows; i++)
for (int j = 0; j < a.cols; j++)
b.at<Vec3b>(i, j) = 0.2*a.at<Vec3b>(i, j)[0] + 0.3*a.at<Vec3b>(i, j)[1] + 0.5*a.at<Vec3b>(i,j)[2];
imshow("加权图", b);
vector<Mat> channels;
split(b, channels);
Mat c = channels[0];
Mat d=c;
imshow("灰度图", c);
*/
/*②第二种方法,可以将RGB三通道直接加权成uchar单通道图,比较省事*/
Mat b(a.size(), CV_8U);
for (int i = 0; i < a.rows; i++)
for (int j = 0; j < a.cols; j++)
b.at<uchar>(i, j) = 0.2*a.at<Vec3b>(i, j)[0] + 0.3*a.at<Vec3b>(i, j)[1] + 0.5*a.at<Vec3b>(i, j)[2];
imshow("加权灰度图", b);
vector<Mat> channels;
split(b, channels);
Mat c = channels[0];
Mat d = c;//这个split没有实际作用
imshow("灰度图", c);
for (int i = 0; i < c.rows; i++)
for (int j = 0; j < c.cols; j++)
d.at<uchar>(i,j) = 255 - c.at<uchar>(i,j);
imshow("反转图",d);
waitKey(0);
}