在 OpenCV 的图像处理世界中,除了图像边框处理,还有一些基础且重要的函数和运算,它们在图像编辑、融合等场景中发挥着关键作用。下面我们就来详细介绍cv2.copyMakeBorder()函数的具体参数与作用,以及图像加法运算和加权运算的相关内容。
一、图像边界扩充:
copyMaKeBorder()函数:
函数原型:
dst = cv2.threshold(src,top,bottom,left,right,borderType,value=None)
src:这是要扩充边界的原始图像,是函数处理的基础对象。
top、bottom、left、right:分别表示在图像上、下、左、右四个方向上添加的边界宽度
borderType:定义要添加边框的类型,不同的类型会产生截然不同的边界效果,具体如下:
1.CV2.BORDER_CONSTANT:
添加的边界框像素值为常数(需要额外再给定一个参数)。
示例代码:
value=额外给定参数(rgb参数)
import cv2
ys = cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
constant = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(100,73,210))
cv2.imshow('yuan',ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT',constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
可以看出边框被玫红色填补
2.CV2.BORDER_REFLECT:
添加的边框像素将是边界元素的镜面反射,类似于gfedchalabcdefghlhgfedcba。(交界处也复制了)
import cv2
ys = cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
reflet = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
cv2.imshow('yuan',ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT',constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.CV2.BORDER_REFLECT_101 或
CV2.BORDER_DEFAULT:
和上面类似,但是有一些细微的不同,类似于gfedcblabcdefghgfedcba (交接处删除了)
示例代码:
这个图不明显。。
import cv2
ys = cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
reflet101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
cv2.imshow('yuan',ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT',constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. CV2.BORDER_REPLICATE:
使用最边界的像素值代替,类似于aaaaaalabcdefghIhhhhhhh
示例代码:
import cv2
ys = cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
replicate = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
cv2.imshow('yuan',ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT',constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像相当于被拉伸了,从图中可以明显看出
5.#CV2.BOR激DER_WRAP:
上下左右边依次换,cdefghlabcdefghlabcdefg
示例代码:
import cv2
ys = cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow('yuan',ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT',constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
相同数字为互换位置,不必在意,知道就行了
二、图像中的算数
1. 减法:制造「暗角」特效
c = a - 100
对整张图逐像素减去固定值 100。
结果所有像素变暗,呈现低曝光的胶片感。
注意:NumPy 减法会出现负值回绕(<0 时从 255 继续倒数),如果想把负值截断到 0,应使用 cv2.subtract(a, 100)
。
2. 加法:两张图「硬叠加」
c = a[50:450, 50:400] + b[50:450, 50:400]
这里是逐像素相加。
溢出截断:OpenCV 的
cv2.add()
会把 >255 的像素强制设为 255,而 NumPy 默认会取模(回绕),造成色彩失真。适合制作重影、鬼影效果。
示例代码:
import cv2
a = cv2.imread('img.png')
b=cv2.imread('longnv.webp')
c=a-100
d = a+100
cv2.imshow('yuan',a)
cv2.imshow('a-10',c)
cv2.imshow('a+10',d)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.两图像相加减:
对于cv2.add()运算,当对图像a,图像b进行加法求和时,遵循以下规则:
当某位置像素相加得到的数值小于255时,该位置数值为俩图像该位置像素相加之和
当某位置像素相加得到的数值大于255时,该位置数值为255
import cv2
a = cv2.imread('img.png')
b=cv2.imread('longnv.webp')
c = a[50:450,50:400]+b[50:450,50:400]
cv2.imshow('a+b',c)
cv2.waitKey(0)
运行结果:
4.图像加权
计算两幅图像的像素值之和时,将每幅图像的权重考虑进来
同样的相加数据,加入权重会得出不一样的图片:
权重大的更为清晰
权重小的较为透明
实例代码:
import cv2
a = cv2.imread('img.png')
b=cv2.imread('longnv.webp')
c = a[50:450,50:400]+b[50:450,50:400]
cv2.imshow('a+b',c)
cv2.waitKey(0)
a = cv2.imread('img.png')
b = cv2.imread('longnv.webp')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
c=cv2.addWeighted(a,0.2,b,0.8,10)
cv2.imshow('addwd',c)
cv2.waitKey(0)
cv2.destroyAllWindows()
#