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()
-
图像加载与预处理
- 读取背景图
img1
和 logo 图img2
- 将背景图按比例缩小(0.5 倍)以便后续处理
- 获取两张图片的尺寸信息(高度、宽度、通道数)
- 读取背景图
-
确定叠加区域(ROI)
roi = img1[:r2,:c2]
从背景图
img1
中截取与 logo 图img2
尺寸相同的区域作为感兴趣区域(ROI),后续将在这个区域进行叠加操作。 -
创建 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)
- 将 logo 图转为灰度图
-
分离前景与背景
-
对 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 的背景部分)
-
-
图像融合
roi[:] = cv2.add(fg1, fg2)
将处理后的 ROI 背景(fg1)和处理后的 logo(fg2)相加,实现 logo 在背景图指定位置的融合。由于
roi
是img1
的一部分,这一操作会直接修改原图img1
。 -
结果显示
最终显示融合后的背景图,完成 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()