> 技术文档 > Opencvday3图像插值方法,图像添加水印,噪点消除

Opencvday3图像插值方法,图像添加水印,噪点消除

目录

图像插值方法:

 图像添加水印:

噪点消除:

最常用的高斯滤波:通过一个核把局部的像素加起来用权重计算出新的值,核越大,效果越好

均值滤波,均值滤波的核心思想是:用一个滑动窗口(通常为正方形)覆盖图像,窗口内所有像素的平均值作为窗口中心像素的新值:

 中值滤波:

双边滤波:

 核心原理


图像插值方法:

图像在放大和缩小的时候像素点在发生变化,如何确定变化后的图像的像素点的值
我画了一张图来理解常用的插值方法实现效果

最近插值法:速度快,但是可能会有像素块

双线性插值法:速度稍慢,但是图片丝滑

import cv2def test01(): # 图像旋转 path=\'../images/zpf1.jpg\' img=cv2.imread(path) # 获取图片的高度和宽度 height, width = img.shape[0], img.shape[1] # 计算旋转中心 center = (width / 2, height / 2) # 获取旋转矩阵,第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是缩放因子 M = cv2.getRotationMatrix2D((width / 2, height / 2), 45, 0.5) # 进行仿射变换,实现图片旋转 rotated_image = cv2.warpAffine(img, M, (width, height)) # 相近插值 dst1 = cv2.warpAffine(img, M, (width, height), cv2.INTER_NEAREST) # 双线性插值: dst2 = cv2.warpAffine(img, M, (width, height), cv2.INTER_LINEAR, ) # 显示旋转后的图片(可选,用于调试查看效果) cv2.imshow(\'Rotated Image\', rotated_image) cv2.imshow(\'dst1\', dst1) cv2.imshow(\'dst2\', dst2) cv2.waitKey(0) cv2.destroyAllWindows()if __name__ == \'__main__\': test01()

 图像添加水印:

添加水印的操做:

import cv2import numpy as np#引入两个图片,第一个是背景,第二个是logoimg1 = cv2.imread(\"../images/bg.png\")img1 = cv2.resize(img1, dsize=None, fx=0.5, fy=0.5,)img2 = cv2.imread(\'../images/logohq.png\')r1,c1,ch1 = img1.shaper2,c2,ch2 = img2.shaperoi = img1[:r2,:c2]#取出img1中跟img2同样大小的区域# cv2.imshow(\"roi\",roi)gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)#得到logo的灰度图ret, ma1 = cv2.threshold(gray, 170, 255, cv2.THRESH_BINARY)#得到logo的掩膜:黑化的logo# cv2.imshow(\"ma1\",ma1)fg1 = cv2.bitwise_and(roi,roi,mask=ma1)#roi中跟ma1中黑色重叠的部分也变成黑色 其他地方颜色不变cv2.imshow(\"fg1\",fg1)ret, ma2 = cv2.threshold(gray, 170, 255, cv2.THRESH_BINARY_INV)#得到logo的掩膜:白色化的logo# cv2.imshow(\"ma2\",ma2)fg2 = cv2.bitwise_and(img2,img2,mask = ma2)#img2原logo中跟ma2中白色重叠的部分保留 其他地方颜色变黑cv2.imshow(\"fg2\",fg2)roi[:] = cv2.add(fg1, fg2)#合到一起cv2.imshow(\'img1\',img1)#修改roi的数据相当于修改原图:看下面案例cv2.waitKey(0)cv2.destroyAllWindows()
  1. 图像加载与预处理

    • 读取背景图img1和 logo 图img2
    • 将背景图按比例缩小(0.5 倍)以便后续处理
    • 获取两张图片的尺寸信息(高度、宽度、通道数)
  2. 确定叠加区域(ROI)

    roi = img1[:r2,:c2]

     

    从背景图img1中截取与 logo 图img2尺寸相同的区域作为感兴趣区域(ROI),后续将在这个区域进行叠加操作。

  3. 创建 logo 掩膜

    • 将 logo 图转为灰度图gray,便于后续阈值处理
    • 生成两个互补的掩膜:

      python

      # 掩膜ma1:logo区域为黑色(0),背景为白色(255)ret, ma1 = cv2.threshold(gray, 170, 255, cv2.THRESH_BINARY)# 掩膜ma2:logo区域为白色(255),背景为黑色(0)(与ma1相反)ret, ma2 = cv2.threshold(gray, 170, 255, cv2.THRESH_BINARY_INV)
  4. 分离前景与背景

    • 对 ROI 区域处理:

      fg1 = cv2.bitwise_and(roi, roi, mask=ma1)

       

      保留 ROI 中与 ma1 白色区域对应的像素(即去除 ROI 中与 logo 重叠的区域,为后续放置 logo 腾出空间)

    • 对 logo 图处理:

      fg2 = cv2.bitwise_and(img2, img2, mask=ma2)

       

      只保留 logo 图中实际的 logo 内容(去除 logo 的背景部分)

  5. 图像融合

    roi[:] = cv2.add(fg1, fg2)

     

    将处理后的 ROI 背景(fg1)和处理后的 logo(fg2)相加,实现 logo 在背景图指定位置的融合。由于roiimg1的一部分,这一操作会直接修改原图img1

  6. 结果显示
    最终显示融合后的背景图,完成 logo 的叠加效果

噪点消除:

最常用的高斯滤波:通过一个核把局部的像素加起来用权重计算出新的值,核越大,效果越好

 # 高斯滤波,很有用 lvbo2 = cv2.imread(\"../images/lvbo2.png\") dst = cv2.GaussianBlur(lvbo2, (7,7),1) cv2.imshow(\"lvbo2\", lvbo2) cv2.imshow(\"dst\", dst) cv2.waitKey(0) cv2.destroyAllWindows()

均值滤波,均值滤波的核心思想是:用一个滑动窗口(通常为正方形)覆盖图像,窗口内所有像素的平均值作为窗口中心像素的新值:

  • 优点

    • 算法简单,计算速度快,易于实现。
    • 能有效抑制椒盐噪声(随机出现的黑白点噪声)和其他随机噪声。
  • 缺点

    • 平滑效果与窗口大小正相关:窗口越大,去噪效果越强,但会导致图像细节(如边缘、纹理)模糊越严重。
    • 对所有像素一视同仁地平均,容易破坏图像的边缘信息。
  • 典型应用

    • 图像预处理中的初步去噪。
    • 降低高频噪声对后续处理(如边缘检测)的干扰
 # 均值滤波 lvbo2 = cv2.imread(\"../images/lvbo2.png\") dst = cv2.blur(lvbo2, (5,5)) cv2.imshow(\"lvbo2\", lvbo2) cv2.imshow(\"dst\", dst) cv2.waitKey(0) cv2.destroyAllWindows()

 中值滤波:

中值滤波是一种常用的非线性滤波方法,主要用于去除图像中的噪声,尤其对椒盐噪声(图像中随机出现的黑白点)有很好的抑制效果。其核心原理与均值滤波不同,不是计算像素平均值,而是通过排序取中值来替换中心像素值,但是值太大图像会变卡通

 # 中值滤波 lvbo2 = cv2.imread(\"../images/lvbo2.png\") dst = cv2.medianBlur(lvbo2, 13) cv2.imshow(\"lvbo2\", lvbo2) cv2.imshow(\"dst\", dst) cv2.waitKey(0) cv2.destroyAllWindows(

双边滤波:

双边滤波(Bilateral Filtering)是一种结合了空间邻近性和像素值相似性的非线性滤波方法,能够在平滑去噪的同时有效保留图像边缘,克服了高斯滤波等方法过度模糊边缘的问题。

 核心原理

双边滤波的核心思想是:对每个像素进行加权平均时,不仅考虑像素的空间距离(越近权重越高),还考虑像素值的相似性(越接近权重越高)

# 双边滤波 lvbo2 = cv2.imread(\"../images/lvbo2.png\") dst = cv2.bilateralFilter(lvbo2, 9,75,75) cv2.imshow(\"lvbo2\", lvbo2) cv2.imshow(\"dst\", dst) cv2.waitKey(0) cv2.destroyAllWindows()