9. OpenCV图像的基础操作
9.1 获取并修改像素值
# 9.1 获取并修改像素值
import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
cv2.imshow('img',img)
# 读入一幅图像
# img = cv2.imread('OPEN.jpg')
# 根据像素的行和列坐标获取它的像素值。
px = img[100,100]
print(px)
img[100,100]=[255,255,255]
print(img[100,100])
# 改进 使用array.item()分割
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
cv2.waitKey(0)
这段代码是使用OpenCV库读取一张名为’messi5.jpg’的图片,并显示出来。然后获取该图片中坐标为(100, 100)的像素值,并将其修改为白色([255, 255, 255])。最后,使用array.item()和array.itemset()方法分别获取和修改该像素的蓝色通道值。
9.2 获取图像属性
# 9.2 获取图像属性
# 获取图像形状
import cv2
img = cv2.imread('messi5.jpg')
cv2.imshow('img',img)
# 读入一幅图像
print(img.shape)
# 返回图像的像素数目
print(img.size)
# 返回图像的数据类型
print(img.dtype)
cv2.waitKey(0)
这段代码是用于获取图像属性的。首先,它导入了cv2库,然后使用cv2.imread()函数读取名为’messi5.jpg’的图像,并将其存储在变量img中。接着,使用cv2.imshow()函数显示该图像。
接下来,代码打印出图像的形状(shape),即图像的高度、宽度和通道数。形状是一个包含三个元素的元组,分别表示图像的高度、宽度和通道数。例如,对于一张彩色图像,形状可能是(高度, 宽度, 3),其中3表示有3个通道(红、绿、蓝)。
然后,代码打印出图像的像素数目(size),即图像的总像素数。这可以通过将图像的高度乘以宽度得到。
最后,代码打印出图像的数据类型(dtype),即图像中每个像素值的数据类型。数据类型可以是整数或浮点数,具体取决于图像的编码方式。
9.3 图像的ROI
# 9.3 图像的ROI
import cv2
img = cv2.imread('messi5.jpg')
cv2.imshow('img',img)
ball = img[280:340,330:390]
img[273:333,100:160]=ball
cv2.imshow('img',img)
cv2.waitKey(0)
这段代码是使用OpenCV库读取一张名为’messi5.jpg’的图像,并显示出来。然后从图像中截取一个区域(ROI),即从坐标(280, 340)到(330, 390)的区域,并将其存储在变量ball中。接着将这个区域覆盖到原图像的另一个区域(从坐标(100, 160)到(160, 220))上。最后再次显示修改后的图像
9.4 拆分及合并图像通道
# 9.4 拆分及合并图像通道
import cv2
img = cv2.imread('messi5.jpg')
b,g,r = cv2.split(img)
img = cv2.merge([b,g,r])
#查看三个通道是否融合
if b.shape == g.shape == r.shape:
print("图像已将三个通道融合")
else:
print("图像未将三个通道融合")
cv2.imshow('img',img)
# 分别展示三个通道
cv2.imshow('Blue Channel', b)
cv2.imshow('Green Channel', g)
cv2.imshow('Red Channel', r)
img[:,:,2]=0
cv2.waitKey(0)
:: 表示对所有行进行操作。
:: 表示对所有列进行操作。
2: 表示第三个通道,即蓝色通道。
=0: 将第三个通道的所有像素值设置为0。
这段代码是使用OpenCV库读取一张名为’messi5.jpg’的图片,并将其拆分为三个通道(蓝色、绿色和红色)。然后,将这三个通道合并回原图。接下来,检查三个通道的形状是否相同,如果相同则输出"图像已将三个通道融合",否则输出"图像未将三个通道融合"。最后,分别展示三个通道的图像,并将红色通道的值设置为0。
9.5 为图像扩边(填充)
# 9.5 为图像扩边(填充)
from matplotlib import pyplot as plt
import cv2
BLUE=[255,0,0]
img1=cv2.imread('messi5.jpg')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
这段代码的主要功能是读取一张名为’messi5.jpg’的图片,然后使用OpenCV库的copyMakeBorder函数对图片进行边缘填充。填充方式包括:复制、反射、反射101和循环。最后,使用matplotlib库将原始图片和填充后的图片进行对比展示。
代码解析如下:
导入所需的库:matplotlib用于绘图,cv2用于图像处理。
定义蓝色通道的颜色值。
使用cv2.imread函数读取名为’messi5.jpg’的图片,并将其存储在变量img1中。
使用cv2.copyMakeBorder函数对图片进行边缘填充。填充方式包括:复制(replicate)、反射(reflect)、反射101(reflect101)和循环(wrap)。填充的大小为10像素。
使用cv2.copyMakeBorder函数对图片进行边缘填充,填充方式为常量(constant),填充颜色为蓝色(BLUE)。
使用matplotlib库的subplot函数创建子图,分别显示原始图片、复制填充后的图片、反射填充后的图片、反射101填充后的图片、循环填充后的图片和常量填充后的图片。
使用matplotlib库的show函数显示所有子图。