10.Opencv的重要结构体Mat—深拷贝与浅拷贝

目录

Mat深拷贝与浅拷贝

​ 访问图像(Mat)的属性

通道的分离与合并

Mat是什么?

是一个矩阵,灰色图像2通道,彩色图像3通道。

Mat的优点:可以Numpy以矩阵的方式进行访问,操作方便。

 

Mat深拷贝与浅拷贝

拷贝Mat时默认为浅拷贝,只拷贝Header中的内容,数据不变

Mat浅拷贝

Mat A

A = imread(file, IMREAD_COLOR)

Mat B(A);

B与A的Header不同,但指向的数据相同

Mat深拷贝

C++中实现方式有两种

cv ::Mat::clone()

cv::Mat::copyTo()

将DATA也重新赋值一份,A与B完全切断

python中实现:

copy(),使用该方法就是深拷贝

进行深拷贝后,进行图片的处理时不影响原图片,cv2.add也是深拷贝操作

实际测试:

import cv2
import numpy as np

img = cv2.imread('C:\\Users\\Mengyang\\Desktop\\112.png')

#浅拷贝
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)

cv2.waitKey(0)

运行结果:

 访问图像(Mat)的属性

主要为使用print()函数打印输出图像的参数

import cv2
import numpy as np

img = cv2.imread('C:\\Users\\Mengyang\\Desktop\\112.png')

print(img.shape)  #shape中包含三个信息,长度 宽度 通道数
print(img.size)   #图像占用多大的空间,长度*宽度*通道数
print(img.dtype)   #图像中每个元素的位深 uint8表示8位无符号整型0~255

运行结果:

通道的分离与合并

正常的图片含有3个通道,BGR,通道的分离与合并主要采用2个API

split(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:100,10:100] = 255  #分离出来后即为黑白单色
g[10:100,10:100] = 255  #分离出来后即为黑白单色

img2 = cv2.merge((b,g,r))  #通道合并

cv2.imshow('img',img)
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('img2',img2)

cv2.waitKey(0)

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值