我是靠谱客的博主 知性可乐,最近开发中收集的这篇文章主要介绍数字图像处理——直方图均衡化直方图均衡化基本原理具体实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

直方图均衡化

直方图均衡化(Histogram equalization)是一种常用的灰度变换方法。

基本原理

直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。从而增大对比度,使图像清晰,达到增强的目的。

直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

简单来说就是,如果图片较暗,整体的灰度偏向于较低的值,就会对其通过运算进行映射,就能够将灰度值的差距拉开,达到增强的目的。如图片较亮,则相反。

具体实现

我这里写的是RGB三通道的均衡化处理,分别对每个通道进行直方图均衡化,最后合在一起,之后修改了方法,对三个通道进行求平均值再赋值,效果好了很多。

对灰度图像进行处理也是如此,不过RGB的值是一样的。

当然这样的方法处理彩色图像效果不太好,对彩色图像的直方图均衡化一般是通过转换RGB颜色空间为HSL颜色空间,然后只对L空间(Lightness)进行直方图均衡化。

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

using namespace cv;
using namespace std;
//直方图均衡化
Mat Histogramequalization(Mat src) {
    int R[256] = { 0 };
    int G[256] = { 0 };
    int B[256] = { 0 };
    int T[256] = { 0 };
    int rows = src.rows;
    int cols = src.cols;
    int sum = rows * cols;
    //统计直方图的RGB分布
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            B[src.at<Vec3b>(i, j)[0]]++;
            G[src.at<Vec3b>(i, j)[1]]++;
            R[src.at<Vec3b>(i, j)[2]]++;
        }
    }
    //分别对rgb三个通道计算每个色阶的概率,并计算存储均衡化后的色阶
    double rgb[3] = { 0 };
    for (int i = 0; i < 256; i++) {
        rgb[0] += B[i];
        B[i] = rgb[0] * 255 / sum;
        rgb[1] += G[i];
        G[i] = rgb[1] * 255 / sum;
        rgb[2] += R[i];
        R[i] = rgb[2] * 255 / sum;
//求三个通道的平均值
        T[i] = (rgb[0] + rgb[1] + rgb[2])*255/(sum *3);
    }
    //循环每一个像素,取原图的像素值作为新图像的下标值 
    Mat newImg(rows, cols, CV_8UC3);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            /*newImg.at<Vec3b>(i, j)[0] = B[src.at<Vec3b>(i, j)[0]];
            newImg.at<Vec3b>(i, j)[1] = G[src.at<Vec3b>(i, j)[1]];
            newImg.at<Vec3b>(i, j)[2] = R[src.at<Vec3b>(i, j)[2]];*/
            newImg.at<Vec3b>(i, j)[0] = T[src.at<Vec3b>(i, j)[0]];
            newImg.at<Vec3b>(i, j)[1] = T[src.at<Vec3b>(i, j)[1]];
            newImg.at<Vec3b>(i, j)[2] = T[src.at<Vec3b>(i, j)[2]];
        }
    }
    return newImg;
}
int main()
{
    Mat img, result;

    img = imread("xxx.bmp", IMREAD_COLOR);
    namedWindow("Result", WINDOW_AUTOSIZE);
    namedWindow("Origin", WINDOW_AUTOSIZE);
    result = Histogramequalization(img);
    if (result.empty())
    {
        cout << "Error! THE IMAGE IS EMPTY.." << endl;
        return -1;
    }
    else
    {
        imshow("Origin", img);
        imshow("Result", result);
    }
    waitKey(0);
    return 0;
}

最后

以上就是知性可乐为你收集整理的数字图像处理——直方图均衡化直方图均衡化基本原理具体实现的全部内容,希望文章能够帮你解决数字图像处理——直方图均衡化直方图均衡化基本原理具体实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部