目录
简介
1.ROI区域
2.边界填充
3.数值计算
4.图像融合
简介
OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C++语言编写,同时也支持Python、Java、C等语言。由于其开源和广泛使用的特点,在计算机视觉和机器学习领域得到了广泛的应用。
1.ROI区域
截取我们感兴趣的区域:在一张图像中,我们可能只需要其中的一部分,那我们如何截取这部分呢?
在上一篇文章,我们提到图片的本质可以由一组数组来表示
那么我们是否可以用切片来选择我们想要的区域呢
import cv2
image = cv2.imread('image/1.jpg')
cat = image[250:500, 250:500]
cv2.imshow('IMG', cat)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们知道,图像是一组三维的数据,既然我们在平面上进行切片得到我们想要的区域,那么我们是否可以对它的通道进行切分呢?
import cv2
import numpy as np
image = cv2.imread('image/1.jpg')
# cat = image[250:500, 250:500]
# cv2.imshow('IMG', cat)
b,g,r = cv2.split(image)
cat = np.hstack((b,g,r))
cv2.imshow('IMG',cat)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.split()
是OpenCV中的一个函数,用于将多通道图像拆分成各个单通道图像。
为什么都是是灰色的呢,因为提取完后的图片,本质变成了单通道。
那么我想要是那种红色的图片要怎么做呢?
第一种思路:把三个通道分别提取出来,然后创建一个类似图像数据的空数组,最后把你想要的那个通道填充进去
第二种思路:把另外两个通道的值重新复制为0,只保留希望的颜色通道。
import cv2
import numpy as np
image = cv2.imread('image/1.jpg')
img = image.copy()
b, g, r = cv2.split(img)
arr = np.zeros_like(image)
arr[:, :, 2] = r
print(arr)
cv2.imshow('IMG',arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
image = cv2.imread('image/1.jpg')
img = image.copy()
img[:,:,0] = 0
img[:,:,1] = 0
cv2.imshow('IMG', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.边界填充
在图像处理中,常用的边界填充方法有以下几种
常数填充(Constant Padding):使用固定的像素值填充边界。可以通过 cv2.copyMakeBorder()
函数实现,指定 borderType=cv2.BORDER_CONSTANT
。
复制填充(Replicate Padding):将边界像素的值复制到图像边界。可以通过 cv2.copyMakeBorder()
函数实现,指定 borderType=cv2.BORDER_REPLICATE
。
反射填充(Reflect Padding):将边界像素值按照镜像方式填充。可以通过 cv2.copyMakeBorder()
函数实现,指定 borderType=cv2.BORDER_REFLECT
。
import cv2
import numpy as np
image = cv2.imread('image/1.jpg')
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
replicate = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
constant = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT,
value=0)
# print(image)
#
result = np.hstack((constant,reflect, replicate))
cv2.imshow('IMG', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
当使用cv2.copyMakeBorder()
函数进行边界填充时,有几个参数需要理解和设置:
-
src
:原始图像,即要进行边界填充的图像。 -
top
、bottom
、left
、right
:指定要在图像的上方、下方、左侧和右侧添加的边界大小。可以为每个边界分别设置不同的大小,也可以将它们设置为相同的值。 -
borderType
:指定边界填充的方法。常用的参数选项包括:cv2.BORDER_CONSTANT
:常数填充,使用固定的像素值填充边界。cv2.BORDER_REPLICATE
:复制填充,将边界像素的值复制到图像边界。cv2.BORDER_REFLECT
:反射填充,将边界像素值按照镜像方式填充。cv2.BORDER_WRAP
:复制边界填充,将图像水平或垂直方向的边缘复制到对应边界。
-
value
:仅适用于borderType=cv2.BORDER_CONSTANT
情况下,指定要用于填充边界的常数值。可以是一个标量(单个数值)或一个包含与图像通道数匹配的数值的元组。
3.数值计算
第一种,numpy层面的相加,ps 如果数值超过255 会自动对255取余
import cv2
import numpy as np
image1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')
# img = np.array(image1)
image1_1= image1 + 10
print(np.array(image1[:5,:,0]))
print(np.array(image1_1[0:5,:,0]))
第二种,opencv提供的函数
cv2.add(image1,image2) 需要保证图片的尺寸一样
import cv2
import numpy as np
image1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')
if image1.shape != image2.shape:
image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0]))
# img = np.array(image1)
image1_1 = image1 + 10
result = cv2.add(image1 ,image2)
print(np.array(image1[:5, :, 0]))
print(np.array(result[:5, :, 0]))
与numpy不同的是它的数值不会超过255
4.图像融合
cv2.addWeighted()
函数是 OpenCV 中用于图像融合的函数
函数的语法如下:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
-
src1
:要融合的第一个输入图像。 -
alpha
:第一个输入图像的权重系数。它表示src1
图像在融合结果中所占比例。 -
src2
:要融合的第二个输入图像。 -
beta
:第二个输入图像的权重系数。它表示src2
图像在融合结果中所占比例。 -
gamma
:亮度调节参数。它是一个可选的参数,用于进一步调整融合结果的亮度。 -
首先需要注意的一点是,图像融合的两张图片的shape必须一致,不然无法融合。
如下所示
import cv2
image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')
blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)
cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
所以在融合前我们需要,将图片的shape设为一致
import cv2
image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')
# 调整两个图像的大小以保持一致
image1 = cv2.resize(image1, (500, 500))
image2 = cv2.resize(image2, (500, 500))
blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)
cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()