目录:
1 获取图像的属性 2 获取像素值并修改 3 图像ROI(region of interest) 4 拆分及合并通道 5 为图像扩边
1 获取图像的属性
img.shape
可以获取图像的形状。他的返回值是一个包含行数(高),列数(宽), 通道数的元组。
img.size
可以返回图像的像素数目
img.dtype
可以返回返回图像的数据类型
例如:
该文章原图:
程序:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') # 改变默认输出的标准编码
img = cv2.imread('test.jpg')
# 获取图像属性
shape = img.shape
print('图像的形状为: ', shape) # 打印图像形状,包括行、列、通道
size = img.size
print('图像的像素数目为: ', size) # 打印图像的像素数目
dtype = img.dtype
print('图像的数据类型为: ', dtype) # 打印图像的数据类型
结果如下:
2 获取像素值并修改
参数含义
- y:y坐标
- x:x坐标
- bgr:BGR通道,0:B通道,1:G通道,2:R通道
获取像素值
img[y,x]
获取(x,y)处的通道值,返回列表
img[y,x,bgr]
获取(x,y)处一个通道值,bgr表示: 0:B通道,1:G通道,2:R通道
img.item(y,x,bgr)
获取(x,y)处一个通道值,bgr表示: 0:B通道,1:G通道,2:R通道
修改像素值
img[y,x]=[b,g,r]
将一个颜色赋值给一个像素点
img.itemset((y,x,bgr),value)
将一个通道值赋值给一个像素的一个通道
例如
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') # 改变默认输出的标准编码
img = cv2.imread('test.jpg')
# 获取像素值
px = img[100, 200]
print('图像(200,100)处的像素值为: ', px)
# 获取像素中的颜色值
blue = img[100, 200, 0]
print('图像(200,100)处的蓝色像素值为: ', blue)
print('图像(200,100)处的蓝色像素值为: ', img.item(100, 200, 0))
# 修改像素值
img[100, 200] = [0, 0, 0]
px = img[100, 200]
print('修改后图像(200,100)处的像素值为: ', px)
img.itemset((100, 200, 0), 128)
blue = img.item(100, 200, 0)
print('修改后图像(200,100)处的蓝色像素值为: ', blue)
cv2.imshow('modified', img)
k = cv2.waitKey(0) # 始终检测键盘
if k == 27: # 按ESC退出
cv2.destroyAllWindows()
结果:
3 图像ROI(region of interest)
有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是 直接在一幅图像中搜索。这样会提高程序的准确性和性能。
例如:
import cv2
import numpy as np
img = cv2.imread('test.jpg')
cv2.imshow('original', img)
# 选择图像的一部分并复制到图像其他地方
part = img[1:215, 131:364] # 获取一部分
img[216:430, 1:234] = part # 复制到图像另一个地方
cv2.imshow('modified', img)
k = cv2.waitKey(0) # 始终检测键盘
if k == 27: # 按ESC退出
cv2.destroyAllWindows()
结果如下
4 拆分及合并通道
拆分通道
cv2.split(m,mv)
- m: 图像img
- mv: 默认为None
b=img[:,:,bgr]
只获取图像一个通道,bgr表示: 0:B通道,1:G通道,2:R通道
合并通道
cv2.merge(mv,dst)
- mv:输入矢量,默认None
- dst:合并通道组成的列表,例如[b,g,r]
例如:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('test.jpg')
cv2.imshow('original', img)
# 分离颜色通道
b, g, r = cv2.split(img)
cv2.imshow('Blue', b)
cv2.imshow('Green', g)
cv2.imshow('Red', r)
# 其他方法
b1 = img[:, :, 0] # 仅取B通道
cv2.imshow('Blue-1', b1)
b2 = cv2.imread('test.jpg')
b2[:, :, 1:3] = 0 # 将0赋值给G、R通道
cv2.imshow('Blue-2', b2)
merge = cv2.merge([b, g, r])
cv2.imshow('merge', merge)
k = cv2.waitKey(0) # 始终检测键盘
if k == 27: # 按ESC退出
cv2.destroyAllWindows()
结果如下:
5 为图像扩边
cv2.copyMakeBorder(src,top, bottom, left, right,borderType,value)
- src: 输入图像 • top, bottom, left, right 对应边界的像素数目。
- top, bottom, left, right: 对应边界的像素数目
- borderType: 要添加那种类型的边界,类型如下
–cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
– cv2.BORDER_REFLECT边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb
– cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
– cv2.BORDER_REPLICATE重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh
– cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh| abcdefgh|abcdefg
- value: 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANTl
例如:
import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255, 0, 0]
img = cv2.imread('test.jpg')
replicate = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_CONSTANT, value=BLUE)
plt.subplot(231), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(cv2.cvtColor(replicate, cv2.COLOR_BGR2RGB), 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(cv2.cvtColor(reflect, cv2.COLOR_BGR2RGB), 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(cv2.cvtColor(reflect101, cv2.COLOR_BGR2RGB), 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(cv2.cvtColor(wrap, cv2.COLOR_BGR2RGB), 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(cv2.cvtColor(constant, cv2.COLOR_BGR2RGB), 'gray'), plt.title('CONSTANT')
plt.show()
结果如下: