在 Python 中尝试手动创建高斯滤波器时出错
Error trying to manually create Gaussian Filter in Python
我根据实现高斯滤波器所必需的 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了解不多,所以到目前为止所做的更改并没有解决问题。
Python 有“Zero-based 编号”所以你的面具目前看起来像这样:
您可以看到第一行和第一列都是空的,您需要从 0 开始(可能全部 4 个)for-loops。
第二个问题是使用“^”(异或运算符)进行平方(计算“sq_dist”时)。请改用“**”。
使用:
import matplotlib.pyplot as plt
plt.imshow(mascara, "gray")
可视化您的内核。
您还会从从 1 开始的第三个和第四个 for-loop 得到乘法错误。
也不要在 python 的行尾使用 semi-columns :)
在 Im = np.pad(img, [2,2])
行中,您在 img
变量上使用填充,该变量是形状为 (X, Y, 3)
的彩色图像(R、G 和 B 的 3 个维度)。如果灰度图像是您想要使用的,我认为您可能想要使用形状为 (X, Y)
的 I
变量,因此 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]
我根据实现高斯滤波器所必需的 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了解不多,所以到目前为止所做的更改并没有解决问题。
Python 有“Zero-based 编号”所以你的面具目前看起来像这样:
您可以看到第一行和第一列都是空的,您需要从 0 开始(可能全部 4 个)for-loops。
第二个问题是使用“^”(异或运算符)进行平方(计算“sq_dist”时)。请改用“**”。
使用:
import matplotlib.pyplot as plt
plt.imshow(mascara, "gray")
可视化您的内核。
您还会从从 1 开始的第三个和第四个 for-loop 得到乘法错误。 也不要在 python 的行尾使用 semi-columns :)
在 Im = np.pad(img, [2,2])
行中,您在 img
变量上使用填充,该变量是形状为 (X, Y, 3)
的彩色图像(R、G 和 B 的 3 个维度)。如果灰度图像是您想要使用的,我认为您可能想要使用形状为 (X, Y)
的 I
变量,因此 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]