import cv2
#图形的平滑处理(模糊处理):去除图形内噪声(与周围像素格格不入的像素,高亮度)降低细节层次信息 常用工具:滤波器
#滤波核:以一个像素为核心,其周围元素组成n行n列矩阵
# 前三种滤波器方法使得整幅图像平滑,最后一种可有效保护边界信息
# ——————————————————————————均值(低通)滤波器:把每个元素都当成滤波核的核心,计算核内所有像素平均值,让滤波核像素等于这个平均值
# dst = cv2.blur(src,ksize,anchor,borderType) 参数依次是:滤波核大小格式为(高度,宽度)滤波核越大处理后图像越模糊,滤波核的锚点(可选),边界样式(可选)
# 中值滤波器ksize为边长其他滤波器ksize都为(高,宽)
img = cv2.imread("amygdalus triloba.jpg") # 读取原图
dst1 = cv2.blur(img, (3, 3)) # 使用大小为3*3的滤波核进行均值滤波
dst2 = cv2.blur(img, (5, 5)) # 使用大小为5*5的滤波核进行均值滤波
dst3 = cv2.blur(img, (9, 9)) # 使用大小为9*9的滤波核进行均值滤波
cv2.imshow("img", img)
cv2.imshow("3*3", dst1)
cv2.imshow("5*5", dst2)
cv2.imshow("9*9", dst3)
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————中值滤波器:类似均值滤波器,不同:不计算均值,将所有像素值排序,选择中间值赋给核心元素
# dst = cv2.medianBlur(src,ksize) 参数依次是:滤波核的边长必须为大于1的奇数
img = cv2.imread("amygdalus triloba.jpg")
dst1 = cv2.medianBlur(img, 3) # 使用宽度为3的滤波核进行中值滤波
dst2 = cv2.medianBlur(img, 5) # 使用宽度为5的滤波核进行中值滤波
dst3 = cv2.medianBlur(img, 9) # 使用宽度为9的滤波核进行中值滤波
cv2.imshow("img", img)
cv2.imshow("3", dst1)
cv2.imshow("5", dst2)
cv2.imshow("9", dst3)
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————高斯滤波器(高斯模糊、高斯平滑):滤波核中像素与卷积核进行卷积运算,将计算结果赋值给核心像素,越靠近核心的像素权重越大,越原理核心的像素权重越小即离谁更近跟谁更像
# 卷积核:保存的值就是核所覆盖区域的权重值,所有权重值相加为1
# dst = cv2.GaussianBlur(src,ksize,sigmaX,sogmaY) 参数依次是:滤波核的大小,卷积核水平方向的标准差,卷积核垂直方向的标准差,(这俩参数为0表示:由计算机根据滤波核大小自动计算何时的权重比例),边界样式(可选)
img = cv2.imread("amygdalus triloba.jpg")
dst1 = cv2.GaussianBlur(img, (5, 5), 0, 0) # 使用大小为5*5的滤波核进行高斯滤波
dst2 = cv2.GaussianBlur(img, (9, 9), 0, 0) # 使用大小为9*9的滤波核进行高斯滤波
dst3 = cv2.GaussianBlur(img, (15, 15), 0, 0) # 使用大小为15*15的滤波核进行高斯滤波
cv2.imshow("img", img)
cv2.imshow("5", dst1)
cv2.imshow("9", dst2)
cv2.imshow("15", dst3)
cv2.waitKey()
cv2.destroyAllWindows()
# ——————————————————————————双边滤波器:首先判断滤波核处于平坦区域或边缘区域:若为平坦区域则使用类似高斯滤波算法进行滤波,若为边缘区域则加大边缘像素的权重,尽可能让这些像素值保持不变
# dst = cv2.billateralFilter(src, d,sigmaColor,sigmaSpace,borderType)
# 参数依次是:以当前像素为中心的整个滤波区域的直径(若d<0,则自动根据sigmaSpace参数计算得到,该值与保留的边缘信息数量成正比,,该方法与运算效率成反比。
# 参与计算的颜色范围,该值为像素颜色值与周围像素颜色值的最大差值,只有颜色值之差小于此值时,周围元素才进行滤波运算,值为255表示所有值参与运算。
# 坐标空间的a(阿尔法)值,该值越大参与计算的像素数量越多
# 边界样式
img = cv2.imread("amygdalus triloba.jpg")
dst1 = cv2.GaussianBlur(img, (15, 15), 0, 0) # 使用大小为15*15的滤波核进行高斯滤波
dst2 = cv2.bilateralFilter(img, 15, 120, 100) # 双边滤波,选取范围直径为15,颜色差为120
cv2.imshow("img", img)
cv2.imshow("Gauss", dst1) # 显示高斯滤波效果
cv2.imshow("bilateral", dst2) # 显示双边滤波效果
cv2.waitKey()
cv2.destroyAllWindows()