Qt6与OpenCV4.7教程5---图像的直方图均衡化

1、建立控制台程序,并导入如下代码

win32
{
    INCLUDEPATH += F:\OpenCV4.7.0\OpenCV-Build\install\include
    LIBS += F:\OpenCV4.7.0\OpenCV-Build\install\x64\mingw\bin\libopencv_*.dll
}

 2、对main函数进行修改

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

main函数

void drawHist(string windowName, cv::Mat &srcImg)
{
    //需要计算图像的哪个通道(RGB空间需要确定计算R空间、G空间或B空间)
    const int channels[1] = { 0 };
    //直方图的bin数目
    int histSize[] = { 256 };
    //单个维度直方图数值的取值范围
    float singleRanges[] = { 0, 256 };
    //确定每个维度的取值范围,即横坐标的总数
    const float *ranges[] = { singleRanges };
    //输出的直方图,采用MatND类型
    MatND dstHist;
    cv::calcHist(&srcImg, 1, channels, cv::Mat(), dstHist, 1, histSize, ranges, true, false);
    //创建一个白底的图像
    Mat drawImage(Size(256, 256), CV_8UC3, Scalar::all(255));
    //先用cv::minMaxLoc函数计算得到直方图后的像素的最大个数
    double maxValue;
    cv::minMaxLoc(dstHist, 0, &maxValue, 0, 0);
    //遍历直方图得到的数据
    for (int i = 0; i < 256; i++) //从第0个bin到第256个bin
    {
        int value = cvRound(256 * 0.9 *(dstHist.at<float>(i) / maxValue));
        //第i个bin的高度
        cv::line(drawImage, Point(i, drawImage.rows - 1), Point(i, drawImage.rows - 1 - value), Scalar(255, 0, 0)); //绘制柱状图
    }
    cv::imshow(windowName, drawImage);
    cv::waitKey(500);
}

int main()
{
    cv::Mat srcImg1, srcImg2, srcImg3, dstImg1, dstImg2, dstImg3;

    srcImg1 = cv::imread("F:/OpenCV4.7.0/OpenCV-Source/samples/data/aero1.jpg", 0);
    srcImg2 = cv::imread("F:/OpenCV4.7.0/OpenCV-Source/samples/data/aero3.jpg", 0);
    srcImg3 = cv::imread("F:/OpenCV4.7.0/OpenCV-Source/samples/data/aloeGT.png", 0);

    //直方图均衡化
    cv::equalizeHist(srcImg1, dstImg1);
    cv::equalizeHist(srcImg2, dstImg2);
    cv::equalizeHist(srcImg3, dstImg3);

    //保存均衡化的结果
    cv::imwrite("F:/OpenCV4.7.0/OpenCV-Source/samples/data/dstImg1.jpg", dstImg1);
    cv::imwrite("F:/OpenCV4.7.0/OpenCV-Source/samples/data/dstImg2.jpg", dstImg2);
    cv::imwrite("F:/OpenCV4.7.0/OpenCV-Source/samples/data/dstImg3.png", dstImg3);

    //计算并显示直方图
    drawHist("直方图1",srcImg1);
    drawHist("直方图2", srcImg2);
    drawHist("直方图3", srcImg3);
    drawHist("直方图均衡化1", dstImg1);
    drawHist("直方图均衡化2", dstImg2);
    drawHist("直方图均衡化3", dstImg3);

    //显示图像
    cv::imshow("image1", srcImg1);
    cv::imshow("image2", srcImg2);
    cv::imshow("image3", srcImg3);
    cv::imshow("equalize1", dstImg1);
    cv::imshow("equalize2", dstImg2);
    cv::imshow("equalize3", dstImg3);

    cv::waitKey();
    return 0;
}

3、运行结果:

  

  

  

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值