`import numpy as np
import cv2
import time
def my_padding(src, pad_shape, pad_type='zero'):
(h, w) = src.shape
(p_h, p_w) = pad_shape
pad_img = np.zeros((h+2*p_h, w+2*p_w))
pad_img[p_h:p_h+h, p_w:p_w+w] = src
if pad_type == 'repetition':
print('repetition padding')
#up
pad_img[:p_h, p_w:p_w+w] = src[0, :]
#down
pad_img[p_h+h:, p_w:p_w+w] = src[h-1, :]
#left
pad_img[:,:p_w] = pad_img[:, p_w:p_w + 1]
#right
pad_img[:, p_w+w:] = pad_img[:, p_w+w-1:p_w+w]
return pad_img
def my_filtering(src, filter, pad_type='zero'):
(h, w) = src.shape
(f_h, f_w) = filter.shape
src_pad = my_padding(src, (f_h//2, f_w//2), pad_type)
dst = np.zeros((h, w))
for row in range(h):
for col in range(w):
val = np.sum(src_pad[row:row+f_h, col:col+f_w] * filter)
dst[row, col] = val
return dst
def my_get_Gaussian2D_mask(msize, sigma=1):
y, x = np.mgrid[-(msize // 2):(msize // 2) + 1, -(msize // 2):(msize // 2) + 1]
gaus2D = 1 / (2 * np.pi * sigma**2) * np.exp(-(( x**2 + y**2 )/(2 * sigma**2)))
gaus2D /= np.sum(gaus2D)
return gaus2D
def my_normalize(src):
dst = src.copy()
dst *= 255
dst = np.clip(dst, 0, 255)
return dst.astype(np.uint8)
def add_gaus_noise(src, mean=0, sigma=0.1):
#src : 0 ~ 255, dst : 0 ~ 1
dst = src/255
h, w = dst.shape
noise = np.random.normal(mean, sigma, size=(h, w))
dst += noise
return my_normalize(dst)
def my_bilateral(src, msize, sigma, sigma_r, pos_x, pos_y, pad_type='zero'):
(h, w) = src.shape
m_s = (msize-1)//2
img_pad = my_padding(src, (m_s//2, m_s//2), pad_type)
dst = np.zeros((h,w))
y, x = np.mgrid[-(msize // 2):(msize // 2) + 1, -(msize // 2):(msize // 2) + 1]
for i in range(h):
print('\r%d / %d ...' %(i,h), end="")
for j in range(w):
mask = np.exp(-((x-j)**2 + (y-i)**2)/(2*sigma**2))
mask /= np.sum(mask)
if i==pos_y and j == pos_x:
print()
print(mask.round(4))
img = img_pad[i:i+5, j:j+5]
img = cv2.resize(img, (200, 200), interpolation = cv2.INTER_NEAREST)
img = my_normalize(img)
dst[i, j] = np.sum(img_pad[i:i+msize, j:j+msize]*mask)
return dst
if __name__ == '__main__':
start = time.time()
src = cv2.imread('Lenna.png', cv2.IMREAD_GRAYSCALE)
np.random.seed(seed=100)
pos_y = 0
pos_x = 0
src_noise = add_gaus_noise(src, mean=0, sigma=0.1)
src_noise = src_noise/255
dst = my_bilateral(src_noise, 5, 10, 0.1, pos_x, pos_y)
dst = my_normalize(dst)
gaus2D = my_get_Gaussian2D_mask(5 , sigma = 1)
dst_gaus2D= my_filtering(src_noise, gaus2D)
dst_gaus2D = my_normalize(dst_gaus2D)
cv2.imshow('original', src)
cv2.imshow('gaus noise', src_noise)
cv2.imshow('my gaussian', dst_gaus2D)
cv2.imshow('my bilateral', dst)
tital_time = time.time() - start
print('\ntime : ', tital_time)
if tital_time > 25:
print('please change code')
cv2.waitKey()
cv2.destroyAllWindows()`
我想做一个执行双边过滤的代码。
其他功能是完成的部分, 我想编写一个代码,通过仅修改函数“my_bilatera”和“main”来执行双边过滤。 但 第 101 行,在 src_noise = add_gaus_noise(src, mean=0, sigma=0.1)
第 56 行,在 add_gaus_noise 中 dst = 源/255 TypeError: 不支持的操作数类型 /: 'NoneType' 和 'int' 有错误
在蒙版过滤过程中,我可能会因为图像的大小而出错,我该如何解决? 存储图像的路径执行没有任何问题。 如果您能告诉我如何修改它,我将不胜感激。 我上传它是因为我缺乏知识,无法快速处理它。 如果你让我知道,我会学习更多。 谢谢……