具体内容:用打开 OpenCV 打开图像,并在窗口中显示
具体内容:设置并调整阈值对图像进行二值化处理。
图像二值化( Image Binarization):就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
具体内容:设置并调整 r 值对图像进行对数变换。
对数变换公式: s = c × l o g ( 1 + r ) s=c\times log(1+r) s=c×log(1+r)
c c c:常数,预先设定好
r r r:原始图像的灰度值
s s s:变换之后的灰度值
作用:扩展图像中的暗像素的值,同时压缩更高灰度级的值。
具体内容:设置并调整 γ \gamma γ值对图像进行伽马变换。
伽马变换公式: s = c × r γ s=c\times r^{\gamma} s=c×rγ
根据不同的 γ \gamma γ值,其作用也不尽相同
具体内容:对彩色图像进行补色变换。
注:补色变换与反色变换不同
补色变换公式: s = m a x ( r , g , b ) + m i n ( r , g , b ) − [ r , g , b ] s=max(r,g,b)+min(r,g,b)-[r,g,b] s=max(r,g,b)+min(r,g,b)−[r,g,b]
反色变换公式: s = 255 − r s=255-r s=255−r
实验环境:
(1)OpenCV3.4.3
(2)Ubuntu16.04
(3)VS Code
(4)C++
#include
#include
#include
class Experiment1 {
public:
// 0、彩色图像转灰度图像
cv::Mat color2Gray(cv::Mat src_image){
//创建与原图同类型和同大小的矩阵
cv::Mat gray_image=cv::Mat::zeros(src_image.rows, src_image.cols, CV_8UC1);
if(src_image.channels()!=1){
for(int i = 0; i < src_image.rows; i++)
for(int j = 0; j < src_image.cols; j++)
gray_image.at(i, j) = (src_image.at(i, j)[0] + src_image.at(i, j)[1] + src_image.at(i, j)[2]) / 3;
}
else
gray_image = src_image.clone();
return gray_image;
}
// 1、利用 OpenCV 读取图像
cv::Mat readImage(std::string s = "/home/lyd/image_process/pic/lena.jpg"){
cv::Mat image = cv::imread(s);
cv::namedWindow("Display Image");
cv::imshow("Display Image", image);
cv::waitKey(0);
return image;
}
// 2、灰度图像二值化处理
cv::Mat grayscaleBinarization(cv::Mat src_image, int threshold = 127){
// 彩色图像转为灰度图像
cv::Mat image = color2Gray(src_image);
for(int i = 0; i < image.rows; i++){
for(int j = 0; j < image.cols; j++){
uchar pixel_value = image.at(i, j);
if(pixel_value > threshold)
image.at(i, j) = 255;
else
image.at(i, j) = 0;
}
}
return image;
}
// 3、灰度图像的对数变换
cv::Mat logarithmConversion(cv::Mat src_image, int c = 15){
// 彩色图像转为灰度图像
cv::Mat image = color2Gray(src_image);
for(int i = 0; i < image.rows; i++)
for(int j = 0; j < image.cols; j++)
image.at(i, j) = c * log(1 + image.at(i, j));
return image;
}
// 4、灰度图像的伽马变换(幂指数变换)
cv::Mat gammaConversion(cv::Mat src_image, int c = 1, double gamma = 2){
// 彩色图像转为灰度图像
cv::Mat image = color2Gray(src_image);
for(int i = 0; i < image.rows; i++)
for(int j = 0; j < image.cols; j++)
image.at(i, j) = c * pow(image.at(i, j), gamma);
return image;
}
// 5、彩色图像的反色变换
cv::Mat antiConversion(cv::Mat src_image){
cv::Mat image = src_image.clone();
cv::Vec3b white = (255,255,255);
for(int i = 0; i < image.rows; i++)
for(int j = 0; j < image.cols; j++){
//std::cout<<"before convert: "<(i, j)<<"\n";
image.at(i, j)[0] = white[0] - image.at(i, j)[0];
image.at(i, j)[1] = white[1] - image.at(i, j)[1];
image.at(i, j)[2] = white[2] - image.at(i, j)[2];
//std::cout<<"after convert: "<(i, j)<<"\n \n \n";
}
return image;
}
// 6 彩色图像的补色变换
cv::Mat complementConversion(cv::Mat src_image){
cv::Mat image = src_image.clone();
for(int i = 0; i < image.rows; i++)
for(int j = 0; j < image.cols; j++){
cv::Vec3b sum = (1,1,1);
findmaxmin(image.at(i, j), sum);
image.at(i, j) = sum - image.at(i, j);
}
return image;
}
// 7 找出极值
void findmaxmin(cv::Vec3b num,cv::Vec3b& sum){
int num1 = num[0], num2 = num[0];
for(int i = 0; i < 3; i++){
if(num[i] > num1)
num1 = num[i];
if(num[i] < num2)
num2 = num[i];
}
sum = (num1 + num2) * sum;
}
};
int main(){
std::string s = "/home/lyd/image_process/pic/lena.jpg";
Experiment1 image_convert;
cv::Mat image1 = image_convert.readImage(s);
cv::imshow("灰度图像", image_convert.color2Gray(image1));
cv::waitKey(0);
cv::Mat image2 = image_convert.grayscaleBinarization(image1);
cv::imshow("二值化图像", image2);
cv::waitKey(0);
cv::Mat image3 = image_convert.logarithmConversion(image1);
cv::imshow("对数变换", image3);
cv::waitKey(0);
cv::Mat image4 = image_convert.gammaConversion(image1);
cv::imshow("伽马变换", image4);
cv::waitKey(0);
cv::Mat image5 = image_convert.antiConversion(image1);
cv::imshow("反色变换", image5);
cv::waitKey(0);
cv::Mat image6 = image_convert.complementConversion(image1);
cv::imshow("补色变换", image6);
cv::waitKey(0);
return 1;
}