<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)

图像处理冈萨雷斯:局部直方图处理

  • 局部直方图处理(Local Histogram Processing)
    • 局部直方图均衡化
    • 解决办法:直方图统计(Histogram Statistics)
    • Matlab实现代码
    • 处理后的图像
    • 总结

局部直方图处理(Local Histogram Processing)

我们之前讨论的方法都是基于整张图像直方图进行处理(前面章节的后面再更新)。因此处理的结果也是全局性的,就是只能对整张图片进行优化。但是对于有些图像需要进行局部的优化处理,不墨迹了,直接看下图.

局部直方图均衡化

<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第1张图片

 左:原始图片 中:直方图均衡 右:局部直方图均衡

原始图像中,5个黑块隐藏着其他图案,你看你仔细看。通过直方图均衡处理后的图二,还是看不到隐藏的图案,这是因为直方图均衡化是将图片的直方图‘‘拉伸’’,而且直方图还遵循着一个规则,就是不能黑白颠倒,暗的像素点在均衡化后不能比该像素点亮的像素点还亮

我们在原图中可以看出,隐藏图案的亮度与黑块部分十分接近,因此直方图均衡不能够处理这种情况。

右图是局部直方图均衡处理后的图像。虽然可以看到隐藏图案,但是效果不是非常理想,整张图片变了颜色,隐藏图案也只剩下轮廓。这里就不介绍局部直方图均衡的方法了,若有需要可以留言给我。

解决办法:直方图统计(Histogram Statistics)

  1. 此刻我们的目的是,将对比度较低的地方找出(隐藏图案与黑块),并将对比度较低区域的像素提高(将隐藏图案变亮),并且保持其他地方亮度不变。
    <冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第2张图片

    这就是我们想要的效果。接着看哈。我会逐渐讲解思路和每个公式的意义。

    原图的均值为
    (1)<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第3张图片

    原图的方差为
    (2)
    <冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第4张图片
    其次我们先定义一个3x3邻域,则该邻域Sxy的方差和均值为:
    (3)
    <冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第5张图片
    (4)
    <冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第6张图片
    我们通过下面的公式来输出图片
    (5)<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第7张图片

  2. 就这几个公式就能够达到目的了,现在来说说这公式都是啥吧。
    先看公式(5),该公式的意思就是如果此像素邻域的方差和均值两者都在一个范围内,那么我们将此像素的值乘上一个系数C,否则该点像素保持与原图像素相等。

再次说下我们的目的。
首先我们要将对比度低区域找出来,怎么找呢?我们需要一个比较!我们知道方差体现了一个区域内数值的差距大小,若该区域亮度值相等,则方差为0,而对比度较低区域的方差通常也很小。我们用前面设置的3x3邻域遍历整张图片的每一个像素值,每一次都求一次方差和均值。
<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第8张图片

红色框是左上角方块中隐藏图案;黄色框是该邻域未接近隐藏图案;蓝色框是邻域进入隐藏图案

我们先算出红色框的均值和标准差分别为:35.4,5.5。再算出蓝色框的均值和方差:39.9,4.4。随着邻域进入隐藏图案,方差也会越来越小,我们是否可以用刚进入邻域的方差作为一个阈值呢?只有当该点(c,d)邻域方差小于这个阈值时,我们才提高该点(c,d)的亮度。因此我们k3,即方差最大值可以选择(4.4/原图标准差)。因此,在我们进行遍历的时候,均值在进入区域也会变大。如果方差小于k3时,我们就要将该点像素提高。如何提高呢?这就是系数C的作用了。k2的取值通常为0,因为因此图案中也有方差为0的地方。

系数C的定义就是(max(原图) / max(邻域)),目的就是提高对比度低区域(隐藏图案)的亮度。假设原图最高亮度是200,该邻域最高亮度为20,则200/20=10,我们乘10后,隐藏图案该像素值就会变亮,但不会超过全图最高亮度。

这样我们能够找到对比度较低的地方并处理,但是均值是干嘛的呢?

<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第9张图片

左边对应原图中的白色区域,右图对应原图黑色区域。

我们可以看到无论白色还是黑色区域,区域内亮度值基本相同,如果用方差判断的话他们也会被认定为低对比度区域。但是我们通过求两部分均值:230,32。再跟前面的均值对比,发现不是比目标区域的低就是高。因此我们可以通过均值大小来更加精准的来判断是否为隐藏图像区域。只有均值和方差均满足条件时,才提高亮度。那么k1上线应该选择(隐藏区域最大均值/原图均值)。下限k0通常选择(隐藏区域边界最小均值/原图均值)。这样我们就过滤了黑色和白色区域。

通过公式(5),遍历整张图片,仅改变隐藏图案亮度,我们就会得到处理后的图片。

Matlab实现代码

clear;clc;
img_1 = imread('D:\design\localhist.jpg');
img_1 = rgb2gray(img_1);
img_1 = double(img_1);
[m1,n1] = size(img_1);
outp_img = zeros(m1,n1);
outp_img(1,:) = img_1(1,:);
outp_img(m1,:) = img_1(m1,:);
outp_img(:,1) = img_1(:,1);
outp_img(:,n1) = img_1(:,n1);
m = round(mean2(img_1));
var_img = var(img_1(:));
var_img = round(var_img .^ 0.5);
k0 = 0.21;k1 = 0.3 ;k2 = 0;k3 = 0.049;
max_img = max(max(img_1));
for i=2:m1-1 %方便起见从第二行开始遍历
    for j=2:n1-1
        mS = mean([img_1(i,j) img_1(i-1,j-1) img_1(i,j-1) img_1(i+1,j-1)...
            img_1(i-1,j) img_1(i+1,j) img_1(i-1,j+1) img_1(i,j+1) img_1(i+1,j+1)]);
        varS = var([img_1(i,j) img_1(i-1,j-1) img_1(i,j-1) img_1(i+1,j-1)...
            img_1(i-1,j) img_1(i+1,j) img_1(i-1,j+1) img_1(i,j+1) img_1(i+1,j+1)]) ^ 0.5;
        max_neibor = max(max([img_1(i,j) img_1(i-1,j-1) img_1(i,j-1) img_1(i+1,j-1)...
            img_1(i-1,j) img_1(i+1,j) img_1(i-1,j+1) img_1(i,j+1) img_1(i+1,j+1)]));
        C = round(max_img / max_neibor);
        if (k0 * m <= mS && mS <=k1 * m) && ...
            (k2 * var_img <= varS && varS <=k3 * var_img)  
            outp_img(i,j) = round(C * img_1(i,j));
        else
            outp_img(i,j) = img_1(i,j);
        end
    end
end

imshow(uint8(outp_img)); 

不要喷我代码烂哦。。。 运行需要几秒钟,原因能是循环运算,希望大佬们可以提出一些优化的办法。

处理后的图像

<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)_第10张图片

总结

由于图像是从书中截图下来的,亮度和原图差距较大,比如原图中黑色部分为0,而截下来的图为30多。左下角的一条线没有显示出来,可能需要再调下参数,这个就留给你们了。

第一次发博客,也是当作自己的一个笔记,本文基本根据书中资料和自己的理解,一定有理解错误或不到位的地方,请多指教。我算是刚入门的图像处理,今年研一,正在学习中,希望与大家多交流交流~

你可能感兴趣的:(图像处理,冈萨雷斯,计算机视觉)