我接受了一個挑戰,用Python實作了一些OpenCV函式。其中有很多函式需要用內核對影像進行卷積,所以我寫了這個函式來實作:
def convolve(img, kernel)。 # img應該有零padding。
kx, ky = kernel.shape # kernel是方形的,所以kx == ky。
start, end = floor(kx / 2), ceil(kx / 2)
x, y = img.shape
convolved = np.zeros((x, y))
for i in range(kx, x - kx)。
for j in range(kx, y-kx):
convolved_area = img[i - start:i end, j - start:j end] * kernel
convolved[i][j] = np.sum( convolved_area)
return convolved
當我在一張圖片和一個我制作的內核上運行這個程式時,我收到了一張白色的圖片,唯一的顏色是黑色的填充。
為了測驗,我使用的內核是一個高斯內核:
我使用的是高斯內核。
for x in range(radius):
for y in range(radius)。 # 用公式生成內核。
kernel[x][y] = exp( -0.5 * (pow( (x-mean)/sigma, 2.0) pow((y-mean)/sigma,2.0) ) ) / (2 * pi * sigma * sigma)
幅值 = kernel[x][y]
for x in range(radius)。 # 歸一化內核。
for y in range(radius)。
kernel[x][y] /= magnitude
我知道內核是有效的,因為使用OpenCV的filter2D函式對我有用:
convolved = cv2.filter2D(img, -1, kernel)
我的問題是,為什么我的convolve函式不作業?
uj5u.com熱心網友回復:
你需要為圖片指定uint8的資料型別
convolved = np.zeros((x, y))
制作它
convolved = np.zeros((x, y), 'uint8')
但是我建議使用np.zero_like()方法,它接收一個陣列并回傳充滿零的陣列,保留了陣列的原始資料型別,這樣你就不必指定uint8:
convolved = np.zeros_like(img)
上面的方法是最實用的,但也有幾個備選方案
convolved = np.zeros((x, y)).astype('uint8')
而且
convolved = np.uint8(np.zeros((x, y) )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331318.html
標籤:
下一篇:匯編在列印資訊時跳過第一個符號
