我正在嘗試為影像處理撰寫一個簡單的卷積回圈。當內核加起來為 1 即平滑濾波器時,它似乎作業正常。
但是當使用邊緣檢測過濾器時,會出現奇怪的值:
for i in range(img.shape[1]):
index = []
for j in range(order):
index.append(i j)
array_aux=img_processed[:,index]
img_final[:,i]=np.sum(array_aux*kernel_x,axis=1)
我正在應用一個一維內核,該內核擴展到圖片的整個高度,并通過將該擴展內核與所需列相乘并將所有值相加來進行卷積。我正在使用 cv2.BORDER_REFLECT_101 填充:
Image: Kernel: Final Image:
[ 85 85 85 85 85] [ 1 0 -1] [ 0 0 0 0 0]
[ 85 85 85 85 85] [ 1 0 -1] [ 0 0 0 0 0]
[ 84 84 84 84 84] [ 1 0 -1] [ 0 0 0 0 0]
... ... ...
[106 136 179 170 152] [ 1 0 -1] [ 0 183 222 27 6]
[113 129 172 175 153] [ 1 0 -1] [ 0 197 210 19 30]
[123 125 168 183 156] [ 1 0 -1] [ 0 211 198 12 57]
正如您所看到的,雖然前三行似乎沒問題,但最后 3 行是錯誤的,因為預期為負數。這是怎么回事?
uj5u.com熱心網友回復:
實際上,您的問題似乎是img_final,我懷疑它也是 dtype uint8。
如果您在浮點數和整數之間進行運算,結果將正確地為浮點數。但是當您嘗試將浮點數放入 uint8 陣列時,它會被強制轉換為該陣列。
>>> img_final = np.zeros((3, 3), dtype=np.uint8)
>>> img_final[0,0] = -2.5
>>> img_final
array([[254, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]], dtype=uint8)
只需為其設定正確的型別img_final,它應該沒問題。如果要處理正負整數,int32應該就夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313525.html
上一篇:機器學習——演算法介紹-4
