首頁 > 軟體

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

2022-10-20 14:01:05

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點陣圖切割內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com