C++调用OpenCV实现图像反转处理

1 前言

我们有时会看到这样的一幅图像或图片

C++调用OpenCV实现图像反转处理

其对应的原图是

C++调用OpenCV实现图像反转处理

上边图片转换过程叫做图像反转,其目的就是增强了图像的暗区中白色或灰色的细节,特别是原图中的阴影黑色区域。原理就是 用值255减去像素点上的RGB值,比如用255(白色)-0(黑色)得到的是255(白色)。

下边是将原图转换成灰度图后,将灰度图反转后的图片。

灰度图

C++调用OpenCV实现图像反转处理

灰度图反转后的图片

C++调用OpenCV实现图像反转处理

2 相关概念

像素:

像素是图像的最小单位。每一幅图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。

RGB 图像:

每一种颜色在视觉效果上都可以由不同比例的红、绿、蓝三种颜色合成(R-red,G-green,B-blue)。RGB图像存在3个通道,即R通道、G通道和B通道。其中R通道指的是红色通道;G通道指的是绿色通道;B通道指的是蓝色通道;并且每个色彩通道都在区间[0,255]内取值。RGB图像对应的是RGB色彩空间。

灰度图像:

每个像素都是从黑到白,被处理为256个灰度级别的单色图像。这256个灰度级别分别用区间[0,255]中的数值表示。其中,”0″表示纯黑色,”255″表示纯白色,0~255的数值表示不同亮度(即色彩的深浅程度)的深灰色或者浅灰色。灰度图像对应的是GRAY色彩空间。

BGR 色彩空间:

在RGB色彩空间中,彩色图像的通道顺序是R -> G -> B,但是在OpenCV中,RGB色彩空间被BGR色彩空间取代,使得彩色图像的通道顺序变成了B -> G -> R,与RGB刚好相反。

3 创建测试项目

创建测试项目、配置开发环境,具体可参考之前文章,这里就不多说了

Win10+OpenCV4.6.0之开发环境(VS2022)配置入门_来灵的博客-CSDN博客

这次测试项目名称img_invert,VS2022种创建好的项目截图

C++调用OpenCV实现图像反转处理

将下列代码编辑到img_invert.cpp文件里,代码中有详细的注释

#include <iostream>
#include <opencv2 core core.hpp>
#include <opencv2 opencv.hpp>
#include <opencv2 highgui highgui.hpp>
using namespace cv;
using namespace std;

int main()
{
    //&#x5B9A;&#x4E49;&#x539F;&#x56FE;&#x50CF;
    Mat color;
    //&#x5B9A;&#x4E49;&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#xFF0C;&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x53CD;&#x8F6C;&#x540E;&#x7684;&#x56FE;&#x50CF;
    Mat gray, grayDst;
    int height, width;
    int i, j;

    //&#x8F7D;&#x5165;&#x56FE;&#x7247;
    color = imread("color.jpg");
    if (color.empty())
    {
        cout << "&#x8BFB;&#x53D6;&#x9519;&#x8BEF;" << endl;
        return -1;
    }

    //&#x7070;&#x5EA6;&#x5316;&#xFF0C;&#x7531;&#x539F;&#x56FE;&#x83B7;&#x5F97;&#x7070;&#x5EA6;&#x56FE;&#x50CF;
    cvtColor(color, gray, COLOR_BGR2GRAY);
    //&#x4FDD;&#x5B58;&#x7070;&#x5EA6;&#x56FE;&#x7247;
    cv::imwrite("gray.jpg", gray);

    //&#x83B7;&#x53D6;&#x56FE;&#x50CF;&#x4FE1;&#x606F;
    height = color.rows;

    //&#x5217;&#x9879;&#x8981;&#x4E58;&#x901A;&#x9053;&#x6570;
    width = color.cols * color.channels();

    cout << "&#x5F69;&#x8272;&#x56FE;&#x7247;&#x5BBD;:" << color.cols << ", &#x9AD8;:" << color.rows << "&#xFF0C;&#x901A;&#x9053;&#x6570;:" << color.channels() << endl;
    cout << "&#x5B9E;&#x9645;&#x5BBD;:" << width << endl << endl << endl;

    //&#x521B;&#x5EFA;&#x7A97;&#x53E3;
    namedWindow("color", WINDOW_AUTOSIZE);
    namedWindow("colorDst", WINDOW_AUTOSIZE);

    //&#x663E;&#x793A;&#x539F;&#x56FE;
    imshow("color", color);

    //&#x5F69;&#x8272;&#x56FE;&#x50CF;&#x53CD;&#x8F6C;
    //&#x7B97;&#x6CD5;&#xFF1A;&#x53CD;&#x8F6C;&#x540E;&#x7684;&#x50CF;&#x7D20;a = 255 - a
    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
        {
            color.at<uchar>(i, j) = 255 - color.at<uchar>(i, j);   //&#x5BF9;&#x6BCF;&#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x53CD;&#x8F6C;
        }
    }

    //&#x4FDD;&#x5B58;&#x53CD;&#x8272;&#x540E;&#x7684;&#x56FE;&#x7247;
    cv::imwrite("outputColor.jpg", color);
    //&#x663E;&#x793A;&#x53CD;&#x76F8;&#x56FE;&#x7247;
    imshow("colorDst", color);

    //---------------------&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x53CD;&#x8F6C;------------------
    height = gray.rows;
    //&#x5217;&#x9879;&#x4E58;&#x901A;&#x9053;&#x6570;
    width = gray.cols * gray.channels();

    cout << "&#x7070;&#x5EA6;&#x56FE;&#x7247;&#x5BBD;:" << gray.cols << ", &#x9AD8;:" << gray.rows << "&#xFF0C;&#x901A;&#x9053;&#x6570;:" << gray.channels() << endl;
    cout << "&#x5B9E;&#x9645;&#x5BBD;:" << width << endl << endl << endl;

    namedWindow("gray", WINDOW_AUTOSIZE);
    namedWindow("grayDst", WINDOW_AUTOSIZE);

    //&#x663E;&#x793A;&#x7070;&#x5EA6;&#x56FE;&#x50CF;
    imshow("gray", gray);

    //&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x53CD;&#x8F6C;
    //&#x7B97;&#x6CD5;&#xFF1A;&#x53CD;&#x8F6C;&#x540E;&#x7684;&#x50CF;&#x7D20;a = 255 - a
    grayDst = gray.clone();
    for (int i = 0; i < gray.rows; i++)
    {
        for (int j = 0; j < gray.cols; j++)
        {
            //&#x7070;&#x5EA6;&#x53CD;&#x8F6C;
            grayDst.at<uchar>(i, j) = 255 - gray.at<uchar>(i, j);
        }
    }
    //&#x663E;&#x793A;&#x53CD;&#x8F6C;&#x56FE;&#x50CF;
    imshow("grayDst", grayDst);

    //&#x4FDD;&#x5B58;&#x53CD;&#x8272;&#x540E;&#x7684;&#x56FE;&#x7247;
    imwrite("outputGray.jpg", grayDst);

    //&#x6682;&#x505C;&#xFF0C;&#x4FDD;&#x6301;&#x56FE;&#x50CF;&#x663E;&#x793A;
    waitKey(0);

    return 0;
}
</uchar></uchar></uchar></uchar></opencv2></opencv2></opencv2></iostream>

测试项目工程当前目录

C++调用OpenCV实现图像反转处理

完整的测试项目工程代码可以在这里下载:

C++调用OpenCV实现图像反色处理-图像处理文档类资源-CSDN下载

4 效果截图

C++调用OpenCV实现图像反转处理

5 总结

1)不论是对彩色图像还是灰度图像,做反转处理的原理都是一样的,即用255减去像素点上的RGB值。不同点:彩色图像是3通道,灰度图像是单通道。

Value(目标) = 255 – Value(当前)

2)将彩色图像转换成灰度图像,使用了OpenCV的接口函数

cvtColor(color, gray,code );

参数说明:

color :转换前的图像(即彩色图像)

gray:转换后的图像(即灰度图像)

code:色彩空间转换码(本示例用的是COLOR_BGR2GRAY)

6 参考资料

【第三课:C++和opencv】图像反转_读书导航的博客-CSDN博客

Original: https://blog.csdn.net/chexlong/article/details/127228417
Author: 来灵
Title: C++调用OpenCV实现图像反转处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/701114/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球