Mat的属性以及通道的合并与分离

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之后就是原来的样子。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值