代码如下所示:
import cv2
img = cv2.imread("cat.jpeg")
imgGrey = cv2.imread("cat.jpeg", False)
print(img.shape)
print(imgGrey.shape)
print(img.size)
print(img.dtype)
cv2.imshow('Image', img)
cv2.imshow('Image Grey', imgGrey)
cv2.waitKey(0)
cv2.destroyAllWindows()
有时候我们会只对一张图片的一部分感兴趣,这里就要设定一个ROI区域。
import cv2
img = cv2.imread("cat.jpeg")
region = img[150:600, 150:650]
cv2.imshow('Image', img)
cv2.imshow("Region", region)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下所示(左侧为原图,右侧为截取的ROI区域):
import cv2
# 读取图像
img = cv2.imread("cat.jpeg")
# 显示原始图像
cv2.imshow('Original Image', img)
# 分离颜色通道
blue, green, red = cv2.split(img)
# 显示分离后的颜色通道
cv2.imshow('Blue Channel', blue)
cv2.imshow('Green Channel', green)
cv2.imshow('Red Channel', red)
# 合并颜色通道
merged = cv2.merge([blue, green, red])
# 显示合并后的图像
cv2.imshow('Merged Image', merged)
# 等待用户按下任意键退出
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
在上述代码中,我们首先使用cv2.imread()函数读取图像文件"cat.jpeg",并将结果存储在变量img中。
然后,我们使用cv2.split()函数将图像的颜色通道分离为蓝色、绿色和红色通道,并将它们分别存储在变量blue、green和red中。
接下来,我们使用cv2.imshow()函数显示原始图像和分离后的颜色通道。
然后,我们使用cv2.merge()函数将分离的颜色通道合并成一个图像,并将结果存储在变量merged中。
最后,我们再次使用cv2.imshow()函数显示合并后的图像。用户可以按下任意键退出,然后使用cv2.destroyAllWindows()销毁所有窗口。
请注意,上述代码假设图像是一个BGR图像,即蓝色通道位于索引0,绿色通道位于索引1,红色通道位于索引2。
如果图像的通道顺序不同(如RGB),则需要相应地调整代码。
图像颜色通道的分离与合并在图像处理、计算机视觉、特征提取等场合中有用。具体来说,包括但不限于以下应用:
参数含义如下:
import cv2
img1 = cv2.imread("cat.jpeg")
img2 = cv2.imread("dog.jpeg")
add1 = cv2.add(img1,img2)
add2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 3)
cv2.imshow("add1", add1)
cv2.imshow("add2", add2)
cv2.waitKey()
如果长宽不一致,计算后相加:
import cv2
# 读取两张图片
img1 = cv2.imread("cat.jpeg")
img2 = cv2.imread("dog.jpeg")
# 获取两张图片的尺寸
height1, width1 = img1.shape[:2]
height2, width2 = img2.shape[:2]
# 判断两张图片的尺寸是否一致,如果不一致,调整img2的尺寸
if height1 != height2 or width1 != width2:
img2 = cv2.resize(img2, (width1, height1))
# 进行图像的加法操作
add1 = cv2.add(img1, img2)
# 进行加权加法操作
add2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 3)
# 显示结果
cv2.imshow("add1", add1)
cv2.imshow("add2", add2)
cv2.waitKey()
图像相加在多个场合有用,其中包括图像处理、计算机视觉、深度学习等领域。以下是图像相加一些主要的应用场合:
需要注意的是,图像相加并非简单的将两个图像的像素值相加,而需要考虑图像的亮度、颜色、对比度等因素。
在实际应用中,还需要根据具体需求和场景选择合适的图像相加方法和算法。
import cv2
import numpy as np
# 读取两张图片
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
# 确保两张图片的尺寸是相同的
if img1.shape != img2.shape:
print("两张图片的尺寸必须相同!")
exit()
# 加法操作
add = cv2.add(img1, img2)
# 减法操作
subtract = cv2.subtract(img1, img2)
# 乘法操作
multiply = cv2.multiply(img1, img2)
# 除法操作
divide = cv2.divide(img1, img2)
# 与操作
bitwise_and = cv2.bitwise_and(img1, img2)
# 或操作
bitwise_or = cv2.bitwise_or(img1, img2)
# 非操作
bitwise_not = cv2.bitwise_not(img1)
# 异或操作
bitwise_xor = cv2.bitwise_xor(img1, img2)
# 创建一个新的窗口来显示每个操作的结果
titles = ['Original Image1', 'Original Image2', 'Add', 'Subtract', 'Multiply', 'Divide', 'Bitwise And', 'Bitwise Or', 'Bitwise Not', 'Bitwise Xor']
images = [img1, img2, add, subtract, multiply, divide, bitwise_and, bitwise_or, bitwise_not, bitwise_xor]
for i in range(10):
cv2.imshow(titles[i], images[i])
# 等待用户关闭窗口
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
我们首先读取两张图像并检查它们的尺寸是否相同。
然后,我们对每个像素进行各种操作,包括加减乘除、位操作等。
最后,我们创建一个新的窗口来显示每个操作的结果。
程序会等待用户关闭窗口,然后关闭所有的窗口。
import cv2
import numpy as np
def flood_fill(img, seed_point, new_val, lo_diff=100, up_diff=100, conn=8):
"""
泛洪填充算法实现
参数:
img: 需要处理的图像
seed_point: 泛洪填充的起始点
new_val: 新的颜色值
lo_diff: 最大值与最小值之差的下限
up_diff: 最大值与最小值之差的上限
conn: 连接方式,4代表四连接,8代表八连接
"""
height, width = img.shape[:2]
seed_y, seed_x = seed_point
cv2.floodFill(img, None, seed_point, new_val, loDiff=lo_diff, upDiff=up_diff, flags=conn)
# 读取图片
img = cv2.imread('cat.jpeg')
cv2.imshow('Raw Image', img)
# 确保图片读取正确
if img is not None:
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 选择一个起始点进行泛洪填充
seed_point = (50, 450)
# 新的颜色
new_color = (255, 0, 0) # BGR format
# 进行泛洪填充
flood_fill(img, seed_point, new_color)
# 显示填充后的图片
cv2.imshow('Filled Image', img)
# 等待用户按键,然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("Error: Unable to read the image.")
如下图所示,将左下角的图像泛洪填充成另一个颜色。