若cv.imread('图片路径') 这个图片路径错了,就会报错error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
详细文章转自该博主博文
卷积:就是对于某一位置的像素,通过算法来把它附近的所有像素点的值联合起来,重新设置这个像素的大小。(个人理解)
1.均值模糊函数blur():定义:blur(src,ksize,dst=None, anchor=None, borderType=None)
定义是有5个参数,但最后三个均为none,所以也就2个参数
src:要处理的原图像
ksize: 周围关联的像素的范围:代码中(5,5)就是9*5的大小,就是计算这些范围内的均值来确定中心位置的大小
2.中值模糊函数medianBlur(): 定义:medianBlur(src, ksize, dst=None)
ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示了5*5的方阵
3.高斯平滑函数GaussianBlur():定义:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
sigmaX:标准差
高斯滤波没有考虑图像的边缘,会将边缘模糊掉。
4.高斯双边滤波函数bilateralFilter():定义:bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
d:邻域直径
sigmaColor:颜色标准差
sigmaSpace:空间标准差
通俗理解:当远离边界时,即颜色十分相近,颜色权基本一样时,类似于高斯滤波,这样变可平滑处理图像。当处在边界时(所谓边界,就是颜色反差极大的地方),边界上的点互相颜色相近,会取极大的权值,而边界外的的点,颜色距离很远,权值取的很小(甚重可以忽略不计),这样就保护了边缘(保边去噪)。
5.均值漂移滤波函数pyrMeanShiftFiltering() :定义:pyrMeanShiftFiltering(sr,sp,sr,ds = None,maxLevel = None, termcrit = None )
src:输入图像,8位,三通道的彩色图像。
sp:定义的漂移物理空间半径大小
sr:定义的漂移色彩空间半径大小
这个函数让图像在色彩层面平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。
6.自定义模糊:使用的函数为:filter2D():定义为filter2D(src,ddepth,kernel)
ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致
kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵
修改kernel矩阵即可实现不同的模糊
import cv2 as cv
import numpy as np
from numpy.lib.type_check import imag
def mo_image(src1):
#均值模糊 这里需要了解卷积核原理 括号里的数字必须为单数,且数字越大,模糊效果越明显
src2 = cv.blur(src1,(5,5))
cv.imshow('blur',src2)
# 中值模糊 对椒盐噪声有良好的去噪效果
src2 = cv.medianBlur(src1,5)
cv.imshow('medianBlur',src2)
# 高斯模糊
src2 = cv.GaussianBlur(src1,(5,5),2)
cv.imshow('GaussianBlur',src2)
# 双边滤波
src2 = cv.bilateralFilter(src1,5,5,2)
cv.imshow('bilateralFilter',src2)
# 自定义模糊函数
def zi_image(src1):
kernel1 = np.ones((5,5),np.float)/25 #自定义矩阵,并防止数值溢出
src2 = cv.filter2D(src1,-1,kernel1)
# 自定义模糊
cv.imshow("custom_mean_blur", src2)
kernel2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) #数组里面的数的和为1或0
src2 = cv.fillter2D(src1,-1,kernel2)
# 锐化,使图像更清晰
cv.imshow("custom_sharpening", src2)
def clamp(pv):
if pv > 255:
return 255
if pv < 0:
return 0
return pv
# 添加噪声
def gaussian_noise(image):
h,w,c = image.shape
for row in range(h):
for col in range(w):
# 从0,10之间取三个数
s = np.random.normal(0,10,3)
b = image[row,col,0]
g = image[row,col,1]
r = image[row,col,2]
image[row,col,0] = clamp(b+s[0])
image[row,col,1] = clamp(g+s[1])
image[row,col,2] = clamp(r+s[2])
cv.imshow("noise image",image)
# 边缘保留滤波(EPF)
# 高斯双边滤波
def bilateral_demo(img):
dst = cv.bilateralFilter(src=img, d=0, sigmaColor=100, sigmaSpace=15)
'''
高斯双边模糊,相当于磨皮操作
src:原图像
d: 像素的领域直径,可由sigmaColor和sigmaColor计算得到
sigmaColor: 颜色空间的标准方差,一般越大越好
sigmaSpace: 坐标空间的标准方差(像素单位),一般越小越好
'''
cv.imshow('bilateal_dome', dst)
kennel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 锐化操作使图像更立体
dst1 = cv.filter2D(dst, -1, kennel) # -1 表示和原图一样
cv.imshow('sharpening_dome', dst1)
# 均值偏移滤波
def mean_shift_demo(img):
dst = cv.pyrMeanShiftFiltering(src=img, sp=15, sr=20)
'''
均值偏移滤波处理,想当与把图片转油画的操作
src: 原图像
sp:空间窗的半径(The spatial window radius)
sr: 色彩窗的半径(The color window radius)
通过均值迁移来进行边缘保留滤波有时会导致图像过度模糊
'''
cv.imshow('mean_shift_demo', dst)
if __name__ == '__main__':
'''
模糊函数mo_image()
'''
# src = cv.imread("pic/cat.jpg")
# cv.namedWindow("original", cv.WINDOW_NORMAL)
# cv.imshow("original", src)
# mo_image(src)
# cv.waitKey(0)
# cv.destroyAllWindows()
'''
自定义模糊zi_image()
'''
# src = cv.imread("pic/cat.jpg")
# cv.namedWindow("original", cv.WINDOW_NORMAL)
# cv.imshow("original", src)
# zi_image(src)
# cv.waitKey(0)
# cv.destroyAllWindows()
'''
添加噪声gaussian_noise()
'''
# src = cv.imread("pic/cat.jpg")
# cv.namedWindow("original", cv.WINDOW_NORMAL)
# cv.imshow("original", src)
# gaussian_noise(src)
# cv.waitKey(0)
# cv.destroyAllWindows()
'''
高斯双边滤波bilateral_demo()
'''
# src = cv.imread("data/baboon.jpg")
# cv.namedWindow("original", cv.WINDOW_NORMAL)
# cv.imshow("original", src)
# bilateral_demo(src)
# cv.waitKey(0)
# cv.destroyAllWindows()
'''
均值偏移滤波mean_shift_demo()
'''
src = cv.imread("pic/bizhi.jpg")
cv.namedWindow("original", cv.WINDOW_NORMAL)
cv.imshow("original", src)
mean_shift_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()