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

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

目录

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)

运行结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/756165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存