day28 学习笔记

文章目录


前言

  • 通过今天的学习,我掌握了OpenCV中有关图像水印以及图像去除噪声的原理以及相关操作

一、图像添加水印

1.ROI操作

  • ROI操作即之前学习到的图像切片操作,是为图像添加的水印中的基本步骤
python 复制代码
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.添加水印

  • 可以结合之前学习到的掩膜的思想,分别为水印中的文字或图案以及背景图像制作掩膜,再使用与运算提取出来,最后相加再对原图像待添加位置的切片进行赋值修改即可完成
python 复制代码
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=91111111111
  • cv2.blur(src, ksize)
  • src:指输入的图像
  • ksize:指卷积核的大小
python 复制代码
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=a111111111

  • cv2.boxFilter(src, ddepth,ksize,normalize)
  • ddepth:指输出图像的深度,即输出图像的数据类型
  • normalize:指是否归一化,当normalize为True的时候,方框滤波就是均值滤波,上式中的a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。
python 复制代码
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:该指越大,图像越模糊
python 复制代码
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)
python 复制代码
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
python 复制代码
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

相关推荐
世人万千丶3 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
深度研习笔记3 小时前
OpenCV工业视觉实战11|多线程解耦+视频流稳流+推理加速,彻底解决卡顿阻塞,实现毫秒级工业实时检测
人工智能·opencv·计算机视觉
腾渊信息科技公司4 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
点PY5 小时前
一种从CTA图像中去除扫描床的方法及装置
人工智能·计算机视觉
小白巨白6 小时前
玫瑰花园管理系统:AI识病+3D可视化,一套面向中小型玫瑰种植园的数字化管理工具
css·人工智能·计算机视觉·html5
遇乐的果园6 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
hhzz7 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
遇乐的果园8 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_8 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
Byron Loong8 小时前
【视觉】工业相机通讯协议对比GigE Vision、USB3 Vision、CXP、CL、UVC、RTSP、NDI
计算机视觉·视觉检测·实时音视频