iT邦幫忙

0

OPENCV影像疊加越來越淡

KAN~ 2020-03-23 00:27:551034 瀏覽

今天在實作影像疊加的時候
先是提取了每個BIT-PLANE
https://ithelp.ithome.com.tw/upload/images/20200323/20123185kIpdVCt5Lb.png
然後想把它疊加起來回原圖的時候不知道為甚麼越來淡
https://ithelp.ithome.com.tw/upload/images/20200323/20123185l15ZKMNcG4.png

本人是新手有點摸不著頭緒
也試著用過addWeighted也沒用
麻煩大大們解惑/images/emoticon/emoticon06.gif

補充:
我是想將bit plane8為基礎逐一疊加回去~
我怕我敘述不太完整

謝謝!!
下面是程式碼

更新:
如果用bitwise_and會呈現
https://ithelp.ithome.com.tw/upload/images/20200323/20123185ZdsXJfohyk.png

i=7
while(i-1>=0):
    r[:,:,7] = cv2.bitwise_and(r[:,:,7],r[:,:,i-1])
    cv2.imshow(str(i), r[:,:,7])
    showImage(str(i), r[:,:,7])
    i=i-1



cv2.waitKey()
cv2.destroyAllWindows()
import cv2
import numpy as np


def showImage(title, img):
    ishow = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # for plt.imshow()
    plt.imshow(ishow)
    plt.axis('off')
    plt.title(title)
    plt.show()
    
#讀取灰階影像
lena = cv2.imread("lena.png", 0)
cv2.imshow("lena", lena)
showImage("lena", lena)

#取出影像 rows and cols
r, c = lena.shape

#產生 8 個 bit-plane 對應的 mask
x = np.zeros((r,c,8), dtype = np.uint8)
for i in range(8):
    x[:,:,i] = 2**i

#建立 8 個空白的 bit-planes
r = np.zeros((r,c,8), dtype = np.uint8)

#建立相對應的 bit-planes
for i in range(8):
    r[:,:,i] = cv2.bitwise_and(lena, x[:,:,i])
    mask = r[:,:,i] > 0
    r[mask] = 255
    cv2.imshow(str(i), r[:,:,i])
    showImage(str(i), r[:,:,i])

i=7
while(i-1>=0):
    r[:,:,7] = cv2.add(r[:,:,7],r[:,:,i-1])
    cv2.imshow(str(i), r[:,:,7])
    showImage(str(i), r[:,:,7])
    i=i-1

cv2.waitKey()
cv2.destroyAllWindows()

看更多先前的討論...收起先前的討論...
Kevin iT邦新手 4 級 ‧ 2020-03-23 09:04:09 檢舉
#r[mask] = 255
KAN~ iT邦新手 5 級 ‧ 2020-03-23 13:03:53 檢舉
是把mask那邊給弄掉嗎?
KAN~ iT邦新手 5 級 ‧ 2020-03-23 13:06:39 檢舉
我把mask弄掉 我第一張圖片想呈現的效果就沒了耶
fillano iT邦超人 1 級 ‧ 2020-03-23 15:07:18 檢舉
r是用bitwise_and做出來,那為何疊加時用add?
KAN~ iT邦新手 5 級 ‧ 2020-03-23 16:10:03 檢舉
疊加時 我也試過用bitwise_and 但出來的八張圖都是最後黑白 並沒有疊加成員圖
fillano iT邦超人 1 級 ‧ 2020-03-23 16:30:43 檢舉
你是怎麼做的?
KAN~ iT邦新手 5 級 ‧ 2020-03-23 16:36:47 檢舉
我更新了~Q_Q
KAN~ iT邦新手 5 級 ‧ 2020-03-23 16:37:52 檢舉
我想呈現的效果就是慢慢的把每個BIT PLANE疊加回去變成原圖
fillano iT邦超人 1 級 ‧ 2020-03-24 08:51:11 檢舉
其實kevin提示過了,既然你改過r,那怎麼可能用它來還原?
fillano iT邦超人 1 級 ‧ 2020-03-24 09:42:21 檢舉
而且你改過兩次r這個名稱的變數,第一次是整數,代表多少row,第二次把它改成陣列,第三次又去改陣列內容...

1 個回答

1
fillano
iT邦超人 1 級 ‧ 2020-03-24 10:00:07
最佳解答

還是答一下:

import numpy as np
import cv2

lena = cv2.imread('lena.png', 0)
cv2.imshow('lena', lena)

cv2.waitKey()

r, c = lena.shape

x = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8):
    x[:, :, i] = 2 ** i

r1 = np.zeros((r, c, 8), dtype=np.uint8)

for i in range(8):
    r1[:, :, i] = cv2.bitwise_and(lena, x[:, :, i])
    cv2.imshow(str(i), r1[:, :, i])

cv2.waitKey()

d = np.zeros((r, c), dtype=np.uint8)

for i in range(8):
    d = cv2.add(d, r1[:, :, 7-i])
    cv2.imshow(str(i), d)

cv2.waitKey()

cv2.destroyAllWindows()

這樣其實就可以看到效果。你要知道灰階的格式,每個pixel是8bit,0是黑色,255是白色。所以只取越低的bit,構成的灰階圖顏色越深,甚至會看不清楚。你原先的:

    mask = r[:, :, i] > 0
    r[mask] = 255

是只要有某個bit值為1,結果就是255(白色),整張圖會變成黑白,這樣可以比較清楚看到切開來的bit。這只是要在圖裡面突顯運算的結果,並不是實際的狀況,改了你原來的東西的話,你就無法復原。因為其實只是要在圖裡面突顯運算結果,你其實可以用np.copy()複製結果來處理,這樣就不會動到原來的變數。

KAN~ iT邦新手 5 級 ‧ 2020-03-24 14:08:56 檢舉

謝謝您 我了解了!/images/emoticon/emoticon07.gif

我要發表回答

立即登入回答