[英]Getting different image arrays after doing the same operation in Image Sharpening
我正在嘗試通過應用反銳化蒙版來銳化圖像,您可以在其中用高斯模糊圖像減去圖像,然后將差異添加回圖像。
這是我運行的代碼:
img = cv2.imread('redhat.jpg')
gauss = cv2.GaussianBlur(img,(7,7),0)
diff = img - gauss
sharp = img + diff
cv2_imshow(img)
cv2_imshow(sharp)
原圖:
鋒利的:
而不是上面的代碼,如果我運行:
img = cv2.imread('redhat.jpg')
gauss = cv2.GaussianBlur(img,(7,7),0)
sharp = cv2.addWeighted(img, 2, gauss, -1, 0)
cv2_imshow(img)
cv2_imshow(sharp)
然后我得到正確的清晰圖像:
有人可以向我解釋為什么我在第一個代碼中得到奇怪的結果嗎? 根據我的理解,這兩段代碼都在進行相同的數學運算。
在diff = img - gauss
中,減法產生負值,但兩個輸入是 uint8 類型,因此運算結果被強制轉換為同一類型,不能保存負值。
您必須將其中一個圖像轉換為簽名類型才能使其工作。 例如:
gauss = cv2.GaussianBlur(img,(7,7),0)
diff = img.astype(np.int_) - gauss
sharp = np.clip(img + diff, 0, 255).astype(np.uint8)
使用cv2.addWeighted()
效率更高。
我相信差異是由上溢/下溢引起的
diff = img - gauss
如果源圖像的深度均為 8 位無符號 integer,則 diff 也將具有相同的深度,這會導致減法運算中出現下溢。
相反, addWeighted()
以雙精度執行操作,並在操作后對目標類型執行飽和轉換(請參閱文檔)。 這有效地降低了上溢/下溢的可能性,並且轉換會自動將值修剪到目標標量類型的支持范圍。
如果您仍想使用第一種方法,請將圖像轉換為浮點深度,或使用足夠大的帶符號整數。 手術后,您可能需要對目標深度進行飽和投射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.