簡體   English   中英

在圖像銳化中執行相同操作后得到不同的圖像 arrays

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM