- 获取像素值并修改
- 获取图像的信息参数
- 图像的ROI()
- 图像通道的拆分及合并
- 给图像添加边界(padding)
img[行,列,通道] #通道:b(0),g(1),r(2)
1.获取像素值并修改
import numpy as np
import cv2
img = cv2.imread('../../photo/1.jpg', 1) #读取彩色图像
print(img[100,50,:]) #打印(100,50)处的像素值
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', img[:,:,1]) #显示图像G通道的图像
img[100:300, 200:400, :] = 255 #将图像中某个区域变成白色
cv2.namedWindow('image2', cv2.WINDOW_NORMAL)
cv2.imshow('image2', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.获取图像的信息参数
图像的信息参数(行/列/通道数/图像数据类型/像素数目等)
import numpy as np
import cv2
img = cv2.imread('1.png', 1)
print(img.shape) #获取图像尺寸(行数,列数,通道数)(185,229,3)
print(img.size) #获取图像大小(像素数)(127095)
print(img.dtype) #获取各像素的数据类型(uint8)
3.图像区域(ROI)
有时我们关注的是图像中的某一个区域中的目标,例如在做人脸识别时,首先要做的就是要找到人脸区域,显然,图像区域ROI就是一个很重要的概念。
import numpy as np
import cv2
img = cv2.imread('1.png', 1)
wuding = img[65:133, 65:126, :] #截取屋顶区域
img[65:133, 140:201, :] = wuding #将屋顶区域拷贝到图像其他区域
cv2.imshow('wuding', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.图像通道的拆分及合并
import numpy as np
import cv2
img = cv2.imread('i.png', 1)
b, g, r = cv2.split(img) #拆分(一般不用,因为numpy的矩阵切片与合并操作更高效)
img = cv2.merge(b, g, r) #合并
#拆分方法2:利用numpy的矩阵切片
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
img[:,:,2] = 0 #使所有像素的r通道值为0
5.给图像添加边界(padding)
cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]]) -> dst
- src是输入的图像矩阵;
- top, bottom, left, right分别是各个方向的边界宽度;
- borderType指边界的类型,有以下的多种选择:
** cv2.BORDER_CONSTANT - 颜色边界,RGB值在后一个参数给出
** 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
from matplotlib import pyplot as plt
import numpy as np
import cv2
BLUE = [255, 0, 0]
img = cv2.imread('opencv_logo.jpg', 1)
#添加不同类型的边界
replicate = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_CONSTANT, value = BLUE)
#使用matplotlib绘制,交换R和B的位置,OpenCV中是按BGR,matplotlib中是按RGB排列
#或者转换一下:img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
#plt.xticks([]), plt.yticks([]) 隐藏坐标
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('Replicate'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('Reflect'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('Reflect101'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('Wrap'), plt.xticks([]), plt.yticks([])
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('Constant'), plt.xticks([]), plt.yticks([])
plt.show()