Python灰度變換中位圖切割分析實現

1. 介紹

圖像的像素值是由比特組成的。例如一副256級灰度圖像中,圖像是由8 bit組成。

與之前對比度拉伸的區別是,之前我們主要強調在某一范圍的灰度值作為我們能感興趣的目標將其變亮或者變暗。而位圖切割主要強調每個bit對圖像的貢獻,通過方法將不同位的灰度值值取出來還原成圖像。

如圖所示,一副8 bit圖像,我們可以將圖像分割成8個,將每個圖像對應的比特位取出構建成一副新的圖像

2. 實現方法

例如圖像某一點的像素值為100,對應的二進制為0110 0100

我們的目標很簡單,就是將第1位的0取出來(這裡不要把100看成一個數,將他想象成一幅圖像的所有點,我們要把圖像像素對應二進制的第一位全部取出,組成一副新的圖像)以此類推…

最後為瞭防止取出的灰度值過暗,我們將他映射到最大值255

這裡提供兩種方法實現:

  • 將圖像的二進制和對應的 8bit 相與(0000 0000),例如取第0個比特平面的話圖像就和(0000 0001)與。所以結果隻能是0000 000X (X取決於圖像的最低位),如果X = 1的話,我們認為這個點的像素在 0bit平面有值,將它映射為255;否則為0
  • 圖像像素除以 2^n (n代表第n個比特平面,n從0開始,為瞭滿足編程下標從0開始計數),如果商的整數部分為1的話,說明這個點在n比特平面有值,映射為255;否則為0

註:

  • 這裡映射為255為瞭突出對應比特平面的亮度,否則就算再最高的比特平面,最大值也隻有128灰度值(因為最高的是第7為,2^7 = 128)
  • 如果利用第一種與的方法,但是最後不要拉伸成255,隻是把與的結果作為新的圖像輸出。那麼隻需要將8副圖像全部加起來就可以還原圖像

3. code

這裡用第二種÷的方法實現

如果用第一種與的方法的話,隻需要將中間的代碼段替換成後面的就行,結果是一樣的

import cv2
import numpy as np
gray = cv2.imread('./img.jpg',0)
img = cv2.resize(gray,None,fx = 0.5,fy = 0.5,interpolation=cv2.INTER_AREA)  #縮小圖像
group = []   # 存放每一層的圖像
for n in range(8):
    dst = np.zeros_like(img)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            ret = img[i][j] // pow(2,n)       #ret = img[i][j] & pow(2,n)
            if (ret % 2) ==1:                 # if (ret ==pow(2,n)):
                dst[i][j] = 255
            else:
                dst[i][j] = 0
    group.append(dst)
cv2.imshow('0-3',np.hstack((i for i in group[:4])))
cv2.imshow('4-7',np.hstack((i for i in group[4:])))
cv2.waitKey()
cv2.destroyAllWindows()

輸入圖像:

輸出結果:

4. 比特平面重建圖像

如果還原圖像的話,我們再輸出圖像的時候,就不要映射到255,之間將圖像與比特平面相與的結果輸出即可

import cv2
import numpy as np
gray = cv2.imread('./img.jpg',0)
img = cv2.resize(gray,None,fx = 0.5,fy = 0.5,interpolation=cv2.INTER_AREA)  #縮小圖像
group = []   # 存放每一層的圖像
for n in range(8):
    dst = np.zeros_like(img)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            ret = img[i][j] & pow(2,n)
            dst[i][j] = ret   # 將與的結果作為圖像
    group.append(dst)
cv2.imshow('0-3',np.hstack((i for i in group[:4])))
cv2.imshow('4-7',np.hstack((i for i in group[4:])))
a = np.zeros_like(img)   # 還原
for i in group:
    a += i
cv2.imshow('img',a)
cv2.waitKey()
cv2.destroyAllWindows()

輸出比特平面:

所以圖像相加為:

到此這篇關於Python灰度變換中位圖切割分析實現的文章就介紹到這瞭,更多相關Python位圖切割內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: