opencv学习笔记——4.0

第三章 图像的基本操作

(原来前面三篇都是属于第一第二章的内容,那进度确实是有点慢了……)
本章重点在于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的地方全替换为白色,效果如下:
opencv学习笔记——4.0_第1张图片

访问图像属性

  1. 图像的形状通过img.shape()访问,返回行、列和通道数的元组
    print(img.shape)
    
  2. 像素总数通过img.size()访问
    print(img.size)
    
  3. 图像数据类型通过img.dtype()访问
    print(img.dtype)
    

图像感兴趣区域ROI

在图像处理中,有时需要对特定区域进行处理,比如要检测图像中的眼睛,首先要对整个图像进行人脸检测,获得人脸图像后再搜索其中的眼睛部分,而不是在整个图像中搜索眼睛,这提高了准确性和搜索性能
使用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()

输出效果如下:
opencv学习笔记——4.0_第2张图片

拆分和合并图像通道

在图像处理中,有时需要将三通道分别处理,可以通过cv.split()拆分通道

b, g, r = cv.split(img)
img = cv.merge((b, g, r))

或者通过索引直接获取及修改

b = img[:, :, 0]
img[:, :, 0] = 0

为图像设置边框(填充)

为图像设置边框可以通过cv.copyMakeBorder()来创建,但是这个函数在卷积运算和零填充等方面有更多应用,该函数的参数列表:

  1. src输入的图像;
  2. top上、bottom下、left左、right右边界的数值;
  3. borderType边框的标志,其中包含了:
    • cv.BORDER_CONSTANT 添加恒定的彩色边框,其参数由下一个参数给出
    • cv.BORDER_REPLECT 将边框元素的镜像用于创建边框,即取图像中靠近边框的几个元素翻转后用于创建边框:fedcba | abcdefgh | hgfedcb
    • cv.BORDER_REFLECT和cv.BORDER_DEFAULT的作用大致于上面相同:gfedcb | abcdefgh | gfedcba
    • cv.BORDER_REPLICATE:aaaaaa | abcdefgh | hhhhhhh
    • cv.BORDER_WRAP:cdefgh | abcdefgh | abcdefg
  4. value边框的颜色
    这里直接参考教程的代码和图像示例,调用不同的参数来创建不同的边框类型并输出
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()

opencv学习笔记——4.0_第3张图片

你可能感兴趣的:(opencv,学习,笔记)