山东大学软件学院2018级项目实训 第七周-解决一个小问题
问题
在拖动滑块调整平滑操作的卷积核大小过程中,发现多次使用均值模糊都没有问题。但使用高斯模糊和中位模糊时有时候可以完成操作,但有时候会直接退出程序!
之后多次检查代码(**一个非常折磨且漫长的过程 **)无误后,想到可能是opencv实现高斯模糊和中位模糊的代码出问题了
(其实不是opencv的代码有问题,而是我的操作出了问题)
原来事情是这样的!
均值模糊的卷积核大小可以是偶数,即允许输入一个6*6大小的卷积核:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('2.png')
b,g,r = cv.split(img)
img= cv.merge([r,g,b])
blur = cv.blur(img,(6,6))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
然鹅!
中值滤波器和高斯滤波器的卷积核大小都必须是奇数
可以看到,将卷积核大小改为偶数后就会报错
解决办法
我能想到的一个比较简单的解决办法是,把slider输入的数值都进行value=value*2 -1
操作:
if type == 1:
print('1-高斯模糊')
value = value*2 + 1
intstance.temp_image_blur = cv.GaussianBlur(intstance.m_image, (value, value), 0)
这样做的好处是,对图像的模糊是随着滑块滑动连续变化的
但缺点是,相比于均值模糊,使用这种操作的图像平滑可能会变化过大
至此,图像平滑和形态变化的所有UI都已实现
芜湖!