zoukankan      html  css  js  c++  java
  • 图像直方图均衡化

    1. 直方图均衡化介绍

    自我感觉书上讲的很清楚,直接把截图贴上了。

    在进行直方图均值化的过程如下

    读入图像
    对每个通道分别统计像素值[0,255]出现的次数。
    对每个通道分别求像素值[0,255]出现的概率,得到概率直方图。
    对每个通道分别求像素值[0,255]概率的前缀和,得到累计直方图。
    对每个通道根据累计直方图分别求像素映射函数。
    对每个通道完成每个像素点的映射。
    输出直方图均衡化的图像。
    2.代码(MATLAB)

     1 %直方图均衡化
     2 I = imread('D:/picture/girl.jpg');
     3 I=rgb2gray(I);%如果某些图片不是二维灰度图像要加上这句,否则imhist报错
     4 [height,width] = size(I);
     5 figure 
     6 subplot (221)
     7 imshow(I);%显示原始图像
     8 subplot(222)
     9 imhist(I)%显示原始图像直方图(注释一)
    10 
    11 %进行像素灰度统计
    12 NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
    13 for i = 1:height
    14     for j = 1:width
    15         NumPixel (I(i,j)+1)=NumPixel(I(i,j)+1)+1;%对应灰度值像素点数量增加一9(注释二)
    16     end
    17 end
    18 %计算灰度分布密度
    19 ProbPixel = zeros(1,256);
    20 for i =1:256
    21     ProbPixel(i) = NumPixel(i)/(height*width*1.0);%该灰度值的像素个数除于总的像素点的个数
    22 end
    23 %计算累计直方图分布
    24 CumuPixel = zeros(1,256);
    25 for i = 1:256;
    26     if i == 1
    27         CumuPixel(i) = ProbPixel(i);
    28     else
    29         CumuPixel(i) = CumuPixel(i-1)+ProbPixel(i);%进行累加
    30     end
    31 end
    32 %累计分布取整
    33 
    34 CumuPixel = uint8(256* CumuPixel);%也就是原来图像的灰度级根据累加概率的值变成了新的灰度级(注释三)
    35 %对灰度值进行映射(均衡化)
    36 for k =1:height
    37     for l =1:width
    38         I(k,l)= CumuPixel(I(k,l)+1);%映射,加一的目的是使下标从一开始
    39     end  
    40 end
    41 subplot(223)
    42 imshow(I)%显示原始图像
    43 subplot(224)
    44 imhist(I)%显示原始图像直方图

    运行结果如下

    注:直方图x轴是图像的灰度值,y轴是在该灰度值的像素的个数

    分析:观察图片我们发现对于原始图片整体颜色偏白,对比度不强,直方图分布偏于右边。直方化后的图片整体颜色加深,灰度增强,头发没有原来那么偏白了,直方图整体分布开始偏左且更均匀化,图片整体对比度增强。

    3注释

    注释一

    imhist()主要用于计算图像灰度值的直方图统计;

    第一次使用时出现的错误:
    Error using ==> iptcheckinput Function IMHIST expected its first input, I or X, to be two-dimensional.
    输入的图像必须是二维的图像,当输入的图像是三维的时候,可现转换,转换代码:
    I=imread('nameofupicture.tif');
    I=rgb2gray(I);
    imhist(I);
    imhist()的应用:
    具体用法: 
    imhist( i );直接显示图像i的灰度直方图; 
    imhist(i,n)n为指定灰度级显示直方图; 
    [count, x] = imhist( i ) 获取直方图信息,count为每一级灰度像素个数,x为灰度级,x也可以在imhist(i,x)中指定,可以通过stem(x,count)画相应直方图; 
    如代码
     1 i = imread('D:/picture/ZiXia.jpg');
     2 i=rgb2gray(i);
     3 imshow(i);
     4 figure;
     5 imhist(i);
     6 figure;
     7 imhist(i,32);
     8 figure;
     9 [count,x] = imhist(i,32);
    10 stem(x,count);
    View Code

    注释二

     NumPixel(I(i,j) + 1) --------这个表示的是什么呢?---a NumPixel(I(i,j) + 1) + 1------这个表示像素点的灰度级加1---b I(i,j)-----表示(i,j)点的灰度值 a 处灰度值加1是代码中灰度值得范围的[1,256],不是[0,255] b 处为对灰度值相同的像素做统计加1,可以将NumPixel( I(i,j) + 1)看做是下标为灰度值,数组元素值为对应下标(灰度值)统计像素的个数 比如统计出来的灰度值为23的像素个数为4个,那么代码中的表现形式是:NumPixel( 22 + 1) = 4.

    注释三

     比如原始图像的灰度值为30的像素个数在新图像里面就变为原始图像灰度值小于等于30的像素个数之和作为新图像像素值为30的像素个数。依次类推。

  • 相关阅读:
    get请求数据
    ajax (详细)
    DedeCMS去掉友情链接中“织梦链投放”“织梦链”的方法
    Metro UI CSS可以快速创建一个Windows 8风格的网站
    CSS实现垂直居中的5种方法
    解决jQuery冲突 noConflict
    dedecms pic_scroll.js和jquery-1.9.1.min.js
    js和jquery下拉菜单全攻略
    IE6、IE7、IE8、FireFox css line-height兼容问题
    IE开发利器-IE10中的F12开发者工具
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10601122.html
Copyright © 2011-2022 走看看