Python灰度變換中位圖切割分析實現(xiàn)
1. 介紹
圖像的像素值是由比特組成的。例如一副256級灰度圖像中,圖像是由8 bit組成。
與之前對比度拉伸的區(qū)別是,之前我們主要強調(diào)在某一范圍的灰度值作為我們能感興趣的目標(biāo)將其變亮或者變暗。而位圖切割主要強調(diào)每個bit對圖像的貢獻(xiàn),通過方法將不同位的灰度值值取出來還原成圖像。
如圖所示,一副8 bit圖像,我們可以將圖像分割成8個,將每個圖像對應(yīng)的比特位取出構(gòu)建成一副新的圖像
2. 實現(xiàn)方法
例如圖像某一點的像素值為100,對應(yīng)的二進(jìn)制為0110 0100
我們的目標(biāo)很簡單,就是將第1位的0取出來(這里不要把100看成一個數(shù),將他想象成一幅圖像的所有點,我們要把圖像像素對應(yīng)二進(jìn)制的第一位全部取出,組成一副新的圖像)以此類推...
最后為了防止取出的灰度值過暗,我們將他映射到最大值255
這里提供兩種方法實現(xiàn):
- 將圖像的二進(jìn)制和對應(yīng)的 8bit 相與(0000 0000),例如取第0個比特平面的話圖像就和(0000 0001)與。所以結(jié)果只能是0000 000X (X取決于圖像的最低位),如果X = 1的話,我們認(rèn)為這個點的像素在 0bit平面有值,將它映射為255;否則為0
- 圖像像素除以 2^n (n代表第n個比特平面,n從0開始,為了滿足編程下標(biāo)從0開始計數(shù)),如果商的整數(shù)部分為1的話,說明這個點在n比特平面有值,映射為255;否則為0
注:
- 這里映射為255為了突出對應(yīng)比特平面的亮度,否則就算再最高的比特平面,最大值也只有128灰度值(因為最高的是第7為,2^7 = 128)
- 如果利用第一種與的方法,但是最后不要拉伸成255,只是把與的結(jié)果作為新的圖像輸出。那么只需要將8副圖像全部加起來就可以還原圖像
3. code
這里用第二種÷的方法實現(xiàn)
如果用第一種與的方法的話,只需要將中間的代碼段替換成后面的就行,結(jié)果是一樣的
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()
輸入圖像:
輸出結(jié)果:
4. 比特平面重建圖像
如果還原圖像的話,我們再輸出圖像的時候,就不要映射到255,之間將圖像與比特平面相與的結(jié)果輸出即可
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 # 將與的結(jié)果作為圖像 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()
輸出比特平面:
所以圖像相加為:
到此這篇關(guān)于Python灰度變換中位圖切割分析實現(xiàn)的文章就介紹到這了,更多相關(guān)Python位圖切割內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Python中利用Into包整潔地進(jìn)行數(shù)據(jù)遷移的教程
這篇文章主要介紹了在Python中如何利用Into包整潔地進(jìn)行數(shù)據(jù)遷移,在數(shù)據(jù)格式的任意兩個格式之間高效地遷移數(shù)據(jù),需要的朋友可以參考下2015-03-03python高并發(fā)異步服務(wù)器核心庫forkcore使用方法
這篇文章主要介紹了python高并發(fā)異步服務(wù)器核心庫forkcore的使用方法,大家參考使用吧2013-11-11Python-docx 實現(xiàn)整體修改或者部分修改文字的大小和字體類型
這篇文章主要介紹了Python-docx 實現(xiàn)整體修改或者部分修改文字的大小和字體類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03python安裝virtualenv虛擬環(huán)境步驟圖文詳解
這篇文章主要介紹了python安裝virtualenv虛擬環(huán)境步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09