(原来前面三篇都是属于第一第二章的内容,那进度确实是有点慢了……)
本章重点在于numpy的学习中
img获取的实际上是三维数组,包含行、列和三通道,通过直接修改img数组对应的索引可以用修改像素值
img = cv.imread('./picture/1_read.jpg')
# 通过行列坐标访问像素值,对于BGR图像返回的是数组,灰色图像则返回灰度
px = img[100, 100]
print(px)
# 第三个参数为通道的编号,0表示b,1表示g,2表示r
blue = img[100, 100, 0]
print(blue)
# 修改对应的像素值
img[100, 100] = [255, 255, 255]
print(img[100, 100])
for i in range(512):
for j in range(512):
img[i, j] = [255, 255, 255]
cv.namedWindow('image', 0)
cv.resizeWindow('image', int(1920/2), int(1080/2))
cv.imshow('image', img)
if cv.waitKey(0) & 0xFF == 27: # 等待ESC退出
cv.destroyAllWindows()
由于numpy是高度包装的库,所以对于像素值的修改还是使用item()和itemset()比较好,需要注意的是itemset()第一个参数的要修改的标量,即每次只能修改一个通道的值,如果要将三通道的值都进行修改则只能多次调用itemset()
# 更好的访问和修改方法
print(img.item(10, 10, 2))
for i in range(512):
for j in range(512):
img.itemset((i, j, 0), 255)
img.itemset((i, j, 1), 255)
img.itemset((i, j, 2), 255)
cv.namedWindow('image', 0)
cv.resizeWindow('image', 960, 540)
cv.imshow('image', img)
if cv.waitKey(0) & 0xFF == 27:
cv.destroyAllWindows()
这里将图像左上角512*512的地方全替换为白色,效果如下:
print(img.shape)
print(img.size)
print(img.dtype)
在图像处理中,有时需要对特定区域进行处理,比如要检测图像中的眼睛,首先要对整个图像进行人脸检测,获得人脸图像后再搜索其中的眼睛部分,而不是在整个图像中搜索眼睛,这提高了准确性和搜索性能
使用numpy索引获取ROI,并将获取的图像复制到另一个区域,这里获取的是人影:
img = cv.imread('./picture/1_read.jpg')
human = img[450:650, 1330:1530]
img[800:1000, 150:350] = human
cv.namedWindow('image', 0)
cv.resizeWindow('image', int(1920/2), int(1080/2))
cv.imshow('image', img)
if cv.waitKey(0) & 0xFF == 27: # 等待ESC退出
cv.destroyAllWindows()
在图像处理中,有时需要将三通道分别处理,可以通过cv.split()拆分通道
b, g, r = cv.split(img)
img = cv.merge((b, g, r))
或者通过索引直接获取及修改
b = img[:, :, 0]
img[:, :, 0] = 0
为图像设置边框可以通过cv.copyMakeBorder()来创建,但是这个函数在卷积运算和零填充等方面有更多应用,该函数的参数列表:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img1 = cv.imread('opencv-logo.png')
replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP)
constant= cv.copyMakeBorder(img1,10,10,10,10,cv.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()