文章目录
- 前言
- 一、图像添加水印
- 1.ROI操作
- 2.添加水印
- 二、图像去除噪声
- 1.均值滤波
- 2.方框滤波
- 3.高斯滤波
- 4.中值滤波
- 5.双边滤波
- 6.总结
前言
- 通过今天的学习,我掌握了OpenCV中有关图像水印以及图像去除噪声的原理以及相关操作
一、图像添加水印
1.ROI操作
- ROI操作即之前学习到的图像切片操作,是为图像添加的水印中的基本步骤
img = cv.imread('img\cat1.png')
roi = img[240:380,350:470]
# roi[:] = (0,0,255)
cv.imshow('roi',roi)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
tips:对图像切片进行修改也会同时改变原图像,这是由于切片返回的是原图像的一个视图
2.添加水印
- 可以结合之前学习到的掩膜的思想,分别为水印中的文字或图案以及背景图像制作掩膜,再使用与运算提取出来,最后相加再对原图像待添加位置的切片进行赋值修改即可完成
img1 = cv.imread(r"D:\AI\笔记课件\images\bg.png")
img2 = cv.imread(r"D:\AI\笔记课件\images\logohq.png")h,w = img2.shape[:2]
roi = img1[0:h,0:w]img2_gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)_,img2_mask_1 = cv.threshold(img2_gray,thresh=127,maxval=255,type=cv.THRESH_BINARY_INV)
logo = cv.bitwise_and(img2,img2,mask=img2_mask_1)_,img2_mask_2 = cv.threshold(img2_gray,thresh=127,maxval=255,type=cv.THRESH_BINARY)
bg = cv.bitwise_and(roi,roi,mask=img2_mask_2)roi[:] = bg + logo
- 这里对图像进行二值化操作是根据设定的阈值确定水印的显示区域
二、图像去除噪声
- 在处理图像时,我们往往不希望图像中存在噪点
- 所谓的噪点就是指那些与周围点像素值差距很大的像素点
- 常见的噪声包括:高斯噪声,椒盐噪声等
- 我们可以使用滤波器(卷积核)对图像中的噪声进行平滑处理
1.均值滤波
- 均值滤波是一种最简单的滤波处理,它取的是卷积核区域内元素的均值,如以下的3x3卷积核
x k e r n e l = 1 9 [ 1 1 1 1 1 1 1 1 1 ] xk e r n e l={\frac{1}{9}}{\Bigg[}\begin{array}{l l l}{1}&{1}&{1}\\{1}&{1}&{1}\\{1}&{1}&{1}\end{array}{\Bigg]} xkernel=91[111111111] - cv2.blur(src, ksize)
- src:指输入的图像
- ksize:指卷积核的大小
img = cv.imread(r"D:\AI\笔记课件\images\lvbo2.png")
img_bulr = cv.blur(img,ksize=(3,3),borderType=cv.BORDER_REFLECT_101)
cv.imshow('bulr',img_bulr)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
2.方框滤波
- 与均值滤波相似,只不过卷积核略有差别
k e r n e l = a [ 1 1 1 1 1 1 1 1 1 ] k e r n e l={a}{\Bigg[}\begin{array}{l l l}{1}&{1}&{1}\\{1}&{1}&{1}\\{1}&{1}&{1}\end{array}{\Bigg]} kernel=a[111111111]
- cv2.boxFilter(src, ddepth,ksize,normalize)
- ddepth:指输出图像的深度,即输出图像的数据类型
- normalize:指是否归一化,当normalize为True的时候,方框滤波就是均值滤波,上式中的a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。
img = cv.imread(r"D:\AI\笔记课件\images\lvbo2.png")
img_box_1 = cv.boxFilter(img,-1,(3,3),normalize=True)
img_box_2 = cv.boxFilter(img,-1,(3,3),normalize=False)
cv.imshow('img_box',img_box_2)
cv.waitKey(0)
cv.destroyAllWindows()
3.高斯滤波
- 高斯滤波是一种十分常用的滤波器,使用高斯核进行卷积
- 高斯滤波的本质是加权均值,特点是:中间像素权重高,边缘像素权重低
- 高斯滤波能有效消除高斯噪声,同时保留更多细节,被称为最有用的滤波器
- cv2.GaussianBlur(src, ksize, sigmaX)
- sigmaX:该指越大,图像越模糊
img = cv.imread(r"D:\AI\笔记课件\images\lvbo2.png")
img_gauss = cv.GaussianBlur(img,(3,3),1)
cv.imshow('img_gauss',img_gauss)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
4.中值滤波
- 中值滤波是一种非线性滤波方法,没有核值,该方法对卷积核内的像素值进行排序,取出中位数作为最终结果
- 根据该方法的特性,我们可以很容易地去除图像中的孤立点(比如0,255这样的噪声)
- 我们常常使用中值滤波对椒盐噪声进行处理
- cv.medianBlur(img,ksize)
img = cv.imread(r"D:\AI\笔记课件\images\lvbo3.png")
img_medium = cv.medianBlur(img,3)
cv.imshow('img_medium',img_medium)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
5.双边滤波
- 由于使用之前介绍的滤波方法会模糊掉图像的边缘信息,我们可以使用双边滤波的方法,在去除噪点的同时尽可能保留图像的边缘信息
- 双边滤波同时考虑了像素点的值域信息和空域信息,前面的滤波方法都只考虑了像素的空域信息,即周围像素的位置,而加入空域信息可以更好地筛选出那些离中心点很近但像素值差距很大的噪点
- 双边滤波采用了两个高斯滤波的结合,一个负责计算空间邻近度的权值(也就是空域信息),也就是上面的高斯滤波器,另一个负责计算像素值相似度的权值(也就是值域信息),也是一个高斯滤波器
- cv2.bilateralFilter(src, dsize, sigmaColor, sigmaSpace)
- 最后两个参数用于指定值域和空域上的sigmaX
img = cv.imread(r"D:\AI\笔记课件\images\lvbo2.png")
img_bilate = cv.bilateralFilter(img,3,100,100)
cv.imshow('img_gauss',img_gauss)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
tips:在进行滤波计算的过程中,遇到边界没有像素值时默认使用边界反射101进行填充
6.总结
-
斑点和椒盐噪声优先使用中值滤波。
-
要去除噪点的同时尽可能保留更多的边缘信息,使用双边滤波。
-
线性滤波方式:均值滤波、方框滤波、高斯滤波。
-
非线性滤波方式:中值滤波、双边滤波(速度相对慢)。
THE END