OpenCV ------图像基础处理(一)

在 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参数)

python 复制代码
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。(交界处也复制了)

python 复制代码
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 (交接处删除了)

示例代码:

这个图不明显。。

python 复制代码
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

示例代码:

python 复制代码
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

示例代码:

python 复制代码
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 默认会取模(回绕),造成色彩失真。

  • 适合制作重影、鬼影效果。

示例代码:

python 复制代码
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

python 复制代码
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.图像加权

计算两幅图像的像素值之和时,将每幅图像的权重考虑进来

同样的相加数据,加入权重会得出不一样的图片:

权重大的更为清晰

权重小的较为透明

实例代码:

python 复制代码
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()
#