# coding=utf-8

import cv2


img = cv2.imread("../Data/Image/banboo.png", 0)
cv2.imshow("Origin", img)

# blur
result = cv2.blur(img, (5, 5))
cv2.imshow("Blur", result)

# GaussianBlur
# 1） 加权：高斯滤波就是对整幅图像进行加权平均的过程，权值就是高斯函数。每一个像素点的值，都由其本身和邻域内的其他像素值
#           经过加权平均后得到。所以和均值滤波一样（可看做是加权相同），是一种平滑模糊滤波，即低通滤波
# 2） 数学：I(x0,y0) = sum(G(x,y) * I(x,y)) for (x,y) in 邻域of(x0,y0)
#           由于这个加权式就是卷积 G(x0,y0)＊I(x0,y0),因此也叫高斯卷积滤波
# 3） 参数：src , ksize:邻域范围，sigmaX : X方向的方差，dst:None 生成图片（c++声明带来的,不用关心）,sigmaY:Y方向的方差
#           borderType：边缘的插值方法（边缘像素点不够模板）
#           G(x,y) = a * e^-((x-ux)^2/2*sigmaX^2 + (y-uy)^2/2*sigmaY^2) 其中 a是归一化系数，因为权值和要为1
#           一般二维图片，取ux=uy=0， sigmaX=sigmaY; 即 G(x,y) = a * e^-(x^2 + y^2)/2*sigma^2
#     注意：第一点就是ksize的宽和高必须是奇数；
#           第二点就是如果参数sigmaX=sigmaY=0,则实际用的是公式sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8
# 4)  尺度与sigma：高斯平滑的高斯函数sigma越大，高斯函数越平坦,邻域的像素值获得权重更大
#           (可以认为当sigma->无穷时就成了均值滤波）,图像就会变得越平滑，平滑~=模糊，
#           图像越模糊，模糊会凸显总体特征，而忽略细节特征,也就是凸显大尺度的特征
#           所以认为sigma越大，图片可见的特征尺度越大（小尺度都被忽略了）
# 5)  尺度与放缩：将一个物体图像缩小，
result = cv2.GaussianBlur(img, (5, 5), 1.5)
cv2.imshow("GaussianBlur", result)

# 中值滤波 中值滤波器对消除椒盐现象特别有用
result = cv2.medianBlur(img, 5)                 # 中值滤波器使用5×5的范围来进行每个像素单元的计算
cv2.imshow("medianBlur", result)

result = cv2.Sobel(result, cv2.CV_16S, 1, 0)    # x 方向的一阶差分
result = cv2.convertScaleAbs(result)            # 转化会uint8,这样才能正常显示
cv2.imshow("Sobel", result)

# 二阶差分
result = cv2.Laplacian(img, cv2.CV_16S)         # 使用CV_16S是为了防止越界
result = cv2.convertScaleAbs(result)            # 转化会uint8,这样才能正常显示
cv2.imshow("Laplacian", result)

cv2.waitKey(0)
cv2.destroyAllWindows()






