我基于已經實作高斯濾波器的 MATLAB 代碼創建了一個 Python 代碼。但是當我運行專案時,出現以下錯誤:
Traceback (most recent call last):
File "C:\Users\gisla\Scilab_PDI\gaussianFilter.py", line 37, in <module>
conv = np.multiply(temp, mascara);
ValueError: operands could not be broadcast together with shapes (4,4,7) (5,5)
代碼如下。影像“result.jpg”只是我試圖過濾的彩色影像。它沒有噪音,因為它只是在測驗代碼是否真的會修改影像。
import cv2
import matplotlib as plt
from math import e;
img = cv2.imread("result.jpg");
I = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sigma = 1;
# Máscara 5x5
mascara = np.zeros((5,5));
W = 0;
def getExp(n):
return e**n
#Filter
for i in range (1, 5):
for j in range (1, 5):
sq_dist = (i-3)^2 (j-3)^2;
mascara[i,j] = getExp(-1*(sq_dist)/(2*sigma*sigma));
W = W mascara[i,j];
mascara = mascara/W;
[m,n] = np.shape(I);
saida = np.zeros((m,n), dtype=np.uint8);
Im = np.pad(img, [2,2]);
for i in range(1, m):
for j in range(1, n):
temp = Im[i:i 4, j:j 4];
temp = np.double(temp);
conv = np.multiply(temp, mascara);
saida[i,j] = np.sum(conv[:])
cv2.imwrite('resultado.jpg', img)
我對 Python 了解不多,所以到目前為止所做的更改并沒有解決問題。
uj5u.com熱心網友回復:
在該行中Im = np.pad(img, [2,2]),您使用img變數上的填充,這是您的具有形狀的彩色影像(X, Y, 3)(R、G 和 B 的 3 個維度)。如果灰度影像是您想要使用的,我認為您可能希望將I變數與 shape一起使用(X, Y),所以Im = np.pad(I, [2,2]).
另請注意,Python 索引的作業方式與 Matlab 索引不同。索引從 開始0,您必須更改行
for i in range(1, m):
for j in range(1, n):
temp = Im[i:i 4, j:j 4]
到
for i in range(0, m):
for j in range(0, n):
temp = Im[i:i 5, j:j 5]
uj5u.com熱心網友回復:
Python 具有“從零開始的編號”,因此您的 Mask 當前如下所示:

您可以看到第一行和第一列是空的,您需要從 0 開始(可能全部 4 個)for 回圈。
第二個問題是使用“^”(XOR 運算子)進行平方(計算“sq_dist”時)。請改用“**”。

采用:
import matplotlib.pyplot as plt
plt.imshow(mascara, "gray")
可視化您的內核。
您還會從 1 開始的第三個和第四個 for 回圈開始得到乘法錯誤。也不要在 python 的行尾使用半列:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/472823.html
上一篇:基于影像作為矢量圖形的直方圖
下一篇:如何計算到像素的距離
