天天看點

<岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)

圖像處理岡薩雷斯:局部直方圖處理

  • 局部直方圖處理(Local Histogram Processing)
    • 局部直方圖均衡化
    • 解決辦法:直方圖統計(Histogram Statistics)
    • Matlab實作代碼
    • 處理後的圖像
    • 總結

局部直方圖處理(Local Histogram Processing)

我們之前讨論的方法都是基于整張圖像直方圖進行處理(前面章節的後面再更新)。是以處理的結果也是全局性的,就是隻能對整張圖檔進行優化。但是對于有些圖像需要進行局部的優化處理,不墨迹了,直接看下圖.

局部直方圖均衡化

<岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)
左:原始圖檔 中:直方圖均衡 右:局部直方圖均衡
           

原始圖像中,5個黑塊隐藏着其他圖案,你看你仔細看。通過直方圖均衡處理後的圖二,還是看不到隐藏的圖案,這是因為直方圖均衡化是将圖檔的直方圖‘‘拉伸’’,而且直方圖還遵循着一個規則,就是不能黑白颠倒,暗的像素點在均衡化後不能比該像素點亮的像素點還亮。

我們在原圖中可以看出,隐藏圖案的亮度與黑塊部分十分接近,是以直方圖均衡不能夠處理這種情況。

右圖是局部直方圖均衡處理後的圖像。雖然可以看到隐藏圖案,但是效果不是非常理想,整張圖檔變了顔色,隐藏圖案也隻剩下輪廓。這裡就不介紹局部直方圖均衡的方法了,若有需要可以留言給我。

解決辦法:直方圖統計(Histogram Statistics)

  1. 此刻我們的目的是,将對比度較低的地方找出(隐藏圖案與黑塊),并将對比度較低區域的像素提高(将隐藏圖案變亮),并且保持其他地方亮度不變。
    <岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)

    這就是我們想要的效果。接着看哈。我會逐漸講解思路和每個公式的意義。

    原圖的均值為

    (1)

    <岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)

    原圖的方差為

    (2)

    <岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)

    其次我們先定義一個3x3鄰域,則該鄰域Sxy的方差和均值為:

    (3)

    <岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)
    (4)
    <岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)

    我們通過下面的公式來輸出圖檔

    (5)

    <岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)
  2. 就這幾個公式就能夠達到目的了,現在來說說這公式都是啥吧。

    先看公式(5),該公式的意思就是如果此像素鄰域的方差和均值兩者都在一個範圍内,那麼我們将此像素的值乘上一個系數C,否則該點像素保持與原圖像素相等。

再次說下我們的目的。

首先我們要将對比度低區域找出來,怎麼找呢?我們需要一個比較!我們知道方差展現了一個區域内數值的差距大小,若該區域亮度值相等,則方差為0,而對比度較低區域的方差通常也很小。我們用前面設定的3x3鄰域周遊整張圖檔的每一個像素值,每一次都求一次方差和均值。

<岡薩雷斯圖像處理>局部直方圖處理:直方圖統計(Histogram Statistics)局部直方圖處理(Local Histogram Processing)
紅色框是左上角方塊中隐藏圖案;黃色框是該鄰域未接近隐藏圖案;藍色框是鄰域進入隐藏圖案
           

我們先算出紅色框的均值和标準差分别為: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)局部直方圖處理(Local Histogram Processing)
左邊對應原圖中的白色區域,右圖對應原圖黑色區域。
           

我們可以看到無論白色還是黑色區域,區域内亮度值基本相同,如果用方差判斷的話他們也會被認定為低對比度區域。但是我們通過求兩部分均值: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)局部直方圖處理(Local Histogram Processing)

總結

由于圖像是從書中截圖下來的,亮度和原圖差距較大,比如原圖中黑色部分為0,而截下來的圖為30多。左下角的一條線沒有顯示出來,可能需要再調下參數,這個就留給你們了。

第一次發部落格,也是當作自己的一個筆記,本文基本根據書中資料和自己的了解,一定有了解錯誤或不到位的地方,請多指教。我算是剛入門的圖像處理,今年研一,正在學習中,希望與大家多交流交流~

繼續閱讀