数字图像处理基础实验(一):灰度变换

一、实验内容及原理

1、利用 OpenCV 读取图像。

具体内容:用打开 OpenCV 打开图像,并在窗口中显示

2、灰度图像二值化处理

具体内容:设置并调整阈值对图像进行二值化处理。

图像二值化( Image Binarization):就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。

3、灰度图像的对数变换

具体内容:设置并调整 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:变换之后的灰度值
数字图像处理基础实验(一):灰度变换_第1张图片
作用:扩展图像中的暗像素的值,同时压缩更高灰度级的值。

4、灰度图像的伽马变换

具体内容:设置并调整 γ \gamma γ值对图像进行伽马变换。

伽马变换公式: s = c × r γ s=c\times r^{\gamma} s=c×rγ
数字图像处理基础实验(一):灰度变换_第2张图片
根据不同的 γ \gamma γ值,其作用也不尽相同

5、彩色图像的补色变换

具体内容:对彩色图像进行补色变换。

注:补色变换与反色变换不同

补色变换公式: 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=255r

二、实验代码

实验环境:
(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;
}

三、实验结果

数字图像处理基础实验(一):灰度变换_第3张图片

你可能感兴趣的:(图像处理)