发布于2019-08-20 11:35 阅读(2307) 评论(0) 点赞(6) 收藏(3)
【参考视频网址:】https://www.bilibili.com/video/av24998616
【参考博客网址:】https://cloud.tencent.com/developer/article/1199372
import cv2
import numpy as np
# 确保参数在0,255之间
def clamp(num):
if num > 255:
num = 255
elif num < 0:
num = 0
else:
num = num
return num
# 给图片加上高斯噪声
def gaussian_noise(image): # 这个地方不要用src,否则会改变blur_demo函数中的值
h, w, c = image.shape
image1 = np.ones((h, w, c), dtype=np.uint8)
for row in range(h):
# range(2)为[0, 1],实际上是range(0,2,1)
# range(1, 5, 2)从1开始,2是步数
for col in range(w):
s = np.random.normal(0, 20, (3, ))
# 0表示中心(均值),20表示标准差,20的平方是方差,越大越胖,(3,)shape,表示输出的随机数个数。
b = image[row, col, 0] + s[0]
g = image[row, col, 1] + s[1]
r = image[row, col, 2] + s[2]
image1[row, col, 0] = clamp(b)
image1[row, col, 1] = clamp(g)
image1[row, col, 2] = clamp(r)
return image1
def blur_demo(src):
# (1)高斯模糊图片生成
src_gauss = gaussian_noise(src)
# 目前存在的问题是:输入src,返回src_gauss,但是src变化成src_guass
# 解决方法:在gaussian_noise函数中加上:
# image1 = np.ones((h, w, c), dtype=np.uint8),重新新建了一个变量,这样不改变输入的变量
cv2.imshow("src_gauss", src_gauss)
# (2)均值模糊——模糊都是基于卷积
src_blur_j = cv2.blur(src, (3, 3)) # 卷积核必须为奇数, 轻微模糊(3, 3)
# dst = cv2.blur(image, (1, 9))
# (1, 9)相当于卷积核,越大越模糊,垂直方向上模糊;(9, 1)水平方向上模糊,看大的那个值
cv2.imshow("src_blur_j", src_blur_j)
# (3)中值模糊
src_blur_z = cv2.medianBlur(src, 3)
cv2.imshow("src_blur_z", src_blur_z)
# (4)自定义模糊(均值模糊)
kernel = np.ones([5, 5], dtype=np.float32) / 25 # 自定义卷积核算子
# 一定要记得除以25,这样保证不溢出,否则图象是白色的。
src_blur_mine = cv2.filter2D(src, -1, kernel=kernel)
# filter2D():定义为filter2D(src, ddepth, kernel)
# src原图像, ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致,
# kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵,修改kernel矩阵即可实现不同的模糊
cv2.imshow("src_blur_mine", src_blur_mine)
# (5)锐化模糊
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) # 中心像素比重5,其他元素为0或者-1
# 原则:(1)奇数,(2)总和等于1或者等于0,总和为1做增强,总和为0做边缘梯度
src_blur_sharp = cv2.filter2D(src, -1, kernel=kernel)
cv2.imshow("src_blur_sharp", src_blur_sharp)
# (6)高斯模糊
src_gauss_blur = cv2.GaussianBlur(src_gauss, (5, 5), 0)
# src_gauss_blur = cv2.GaussianBlur(src_gauss, (0, 0), 5)
# 很模糊,毛玻璃效果,轮廓还在但是很模糊,没有被平均保留了像素的主要特征(近视)
# (0, 0)为卷积核大小,15为sigma。如果卷积核为(0,0),则从sigma计算卷积核
# 反之,sigma为0,则要知道卷积核大小
# 总之,sigma和卷积核只取一个就行;如果两个都取,那么从忽略sigma
cv2.imshow("src_gauss_blur", src_gauss_blur)
# (7)高斯双边模糊
# EPF(边缘保留滤波:像素值之间差距太大,这时就不要高斯滤波,使用边缘保留,此时信息很丰富)
src_gauss_bil_blur = cv2.bilateralFilter(src, 0, sigmaColor=30, sigmaSpace=3)
cv2.imshow("src_gauss_bil_blur", src_gauss_bil_blur)
# src_gauss_bil_blur = cv2.bilateralFilter(src, 0, sigmaColor=30, sigmaSpace=5)
# 相同sigmacolor,sigmaspace越大,在"边界"(双边)内模糊的片更大
# src_gauss_bil_blur = cv2.bilateralFilter(src, 0, sigmaColor=60, sigmaSpace=3)
# 相同sigmaspace,sigmacolor越大,在"边界"(双边)内更模糊
# sigmaspace越大,计算量越大,希望它小一些
# sigmacolor一般取大一些,小的差距模糊掉,越大越模糊
# (8)均值迁移
src_shift = cv2.pyrMeanShiftFiltering(src, 10, 10)
cv2.imshow("src_shift", src_shift)
def main():
src = cv2.imread("pic/ss.jpg")
cv2.imshow("src", src)
# 主函数
blur_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
作者:comeonbady
链接:https://www.pythonheidong.com/blog/article/49119/ce8208a542ba0621d463/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!