Mat由两大部分组成,Header,Data
Mat拷贝
默认是浅拷贝
Mat A
A=imread(file,IMREAD_COLOR)
Mat B(A);
深拷贝
在c++中
cv::Mat::clone()
cv::Mat::cpoyTo()
python中直接使用.cpoy()
import cv2
import numpy as np
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
cv2.namedWindow('img3', cv2.WINDOW_NORMAL)
img = cv2.imread('d:\\download\\1.jpg')
cv2.resizeWindow('img', 600, 400)
cv2.resizeWindow('img2', 600, 400)
cv2.resizeWindow('img3', 600, 400)
# 浅拷贝
img2 = img
# 深拷贝
img3 = img.copy()
img[10:100, 10:100] = [0, 0, 255]
cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
# img和img2是浅拷贝,可以发现img和img2都有红色小方块,这就说明,他们的header是不一样的,但是数据是共享的
# img3没有红色方块,可以知道img和img3是深拷贝,他们的data不一样,也就是说除了拷贝了data部分之外还拷贝了header
# 默认是浅拷贝,在python中只有使用.copy()时是深拷贝。
key = cv2.waitKey(0)
if key & 0xff == ord('q'):
cv2.destroyAllWindows()
访问图像(Mat)的属性
import cv2
import numpy as np
# cv2.namedWindow('img', cv2.WINDOW_NORMAL)
# cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
# cv2.namedWindow('img3', cv2.WINDOW_NORMAL)
img = cv2.imread('d:\\download\\1.jpg')
print(img.shape)
# shp属性信息里面第一个是高度,第二个是宽度,第三个是通道数。
print(img.size)
# 图像占用多大的内存空间(内存空间=高度*宽度*通道数)
print(img.dtype)
# 图像中每个元素的位深,可以看到是一个无符号整形8位
key = cv2.waitKey(0)
if key & 0xff == ord('q'):
cv2.destroyAllWindows()
显示结果:
split(mat)
分割出来之后包含多个通道,mat有一个通道就分离出一个,有多个就分离出多个
merge((ch1,ch2,...))
将多个通道融合到一起,最后是一个mat
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8)
B, G, R = cv2.split(img) # 分别得到了每个通道的矩阵
B[10:200, 10:200] = 255 # 变成一个通道的数组之后就不存在颜色的概念了,只有黑白色,所以会显示白色
G[10:200, 10:200] = 255
img2 = cv2.merge((B, G, R)) # 将B和G融合,也就是将BLUE和GREEN融合就成了浅蓝色
cv2.imshow("img", img)
cv2.imshow('B', B)
cv2.imshow('G', G)
cv2.imshow('img2', img2)
key = cv2.waitKey(0)
if key & 0xff == ord('q'):
cv2.destroyAllWindows()
这里选出来的单通道每个都是将亮度调到最高,就是到达了255,如果将R[10:200,10:200]也取出来,最后再合并也是白色,因为每个都调到了最亮,如果不赋值merge之后就是原来的样子。