如何在python中统一分割图像?
我用cv2加载了一个图像。我重新缩放了图像,将其转换为YCbCR颜色空间。我将图像分为3个部分如何在python中统一分割图像?,python,opencv,numpy,Python,Opencv,Numpy,我用cv2加载了一个图像。我重新缩放了图像,将其转换为YCbCR颜色空间。我将图像分为3个部分 image_rescaled.shape Output[8]: (2016, 1512, 3) Y, Cr, Cb = cv2.split(image_rescaled) Y.shape Output[9]: (2016, 1512) 一旦我执行了我需要的任何操作,我就想把这三个组件合并回去。我怎样才能做到?我在这一点上陷入了困境。OpenCV有一个函数可以做
image_rescaled.shape
Output[8]: (2016, 1512, 3)
Y, Cr, Cb = cv2.split(image_rescaled)
Y.shape
Output[9]: (2016, 1512)
一旦我执行了我需要的任何操作,我就想把这三个组件合并回去。我怎样才能做到?我在这一点上陷入了困境。OpenCV有一个函数可以做到这一点。它可以合并任意数量的通道。此外,我们也会做同样的事情
您还可以使用np.split()
或np.dsplit()
将三通道图像分割为单独的通道;但这与cv2.split();检查结果操作的形状(特别是拆分后单个通道的形状):
使用OpenCV函数:
>>> img = cv2.imread('image.png')
>>> b, g, r = cv2.split(img)
>>> bgr = cv2.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640)
>>> bgr.shape
(508, 640, 3)
>>> img = cv2.imread('image.png')
>>> b, g, r = np.dsplit(img, 3)
>>> bgr = np.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640, 1)
>>> bgr.shape
(508, 640, 3)
使用numpy功能:
>>> img = cv2.imread('image.png')
>>> b, g, r = cv2.split(img)
>>> bgr = cv2.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640)
>>> bgr.shape
(508, 640, 3)
>>> img = cv2.imread('image.png')
>>> b, g, r = np.dsplit(img, 3)
>>> bgr = np.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640, 1)
>>> bgr.shape
(508, 640, 3)
无论哪种方式,在与OpenCV或numpy合并后,生成的形状都是您想要的。请注意,这两种方法都可以用于堆叠任意矩阵,不管您需要多少通道。这有助于堆叠图像序列以进行处理或存储。您甚至可以将单通道图像与多通道图像(或者,可能更常见的是,将一个或多个通道添加到图像堆栈中)堆叠在一起:
因此,下一个问题是“是否有任何理由使用一个而不是另一个?”因为输出是相同的,并且它们都处理我们可能需要的输入,所以唯一的另一个主要问题是速度。而且(令我惊讶的是),OpenCV的cv2.merge()
函数的速度快了一个数量级:
import cv2
import numpy as np
img = cv2.imread('image.png')
b, g, r = cv2.split(img)
import timeit
times = range(50000)
start_time = timeit.default_timer()
for t in times:
A = cv2.merge([b, g, r])
print("cv2.merge: ", timeit.default_timer() - start_time, "s")
start_time = timeit.default_timer()
for t in times:
A = np.dstack([b, g, r])
print("np.dstack: ", timeit.default_timer() - start_time, "s")
cv2.merge:3.03491634999922724 s
np.dstack:22.386054433998652秒
OpenCV有一个函数可以实现这一点。它可以合并任意数量的通道。此外,我们也会做同样的事情
您还可以使用np.split()
或np.dsplit()
将三通道图像分割为单独的通道;但这与cv2.split();检查结果操作的形状(特别是拆分后单个通道的形状):
使用OpenCV函数:
>>> img = cv2.imread('image.png')
>>> b, g, r = cv2.split(img)
>>> bgr = cv2.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640)
>>> bgr.shape
(508, 640, 3)
>>> img = cv2.imread('image.png')
>>> b, g, r = np.dsplit(img, 3)
>>> bgr = np.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640, 1)
>>> bgr.shape
(508, 640, 3)
使用numpy功能:
>>> img = cv2.imread('image.png')
>>> b, g, r = cv2.split(img)
>>> bgr = cv2.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640)
>>> bgr.shape
(508, 640, 3)
>>> img = cv2.imread('image.png')
>>> b, g, r = np.dsplit(img, 3)
>>> bgr = np.merge([b, g, r])
>>> img.shape
(508, 640, 3)
>>> b.shape
(508, 640, 1)
>>> bgr.shape
(508, 640, 3)
无论哪种方式,在与OpenCV或numpy合并后,生成的形状都是您想要的。请注意,这两种方法都可以用于堆叠任意矩阵,不管您需要多少通道。这有助于堆叠图像序列以进行处理或存储。您甚至可以将单通道图像与多通道图像(或者,可能更常见的是,将一个或多个通道添加到图像堆栈中)堆叠在一起:
因此,下一个问题是“是否有任何理由使用一个而不是另一个?”因为输出是相同的,并且它们都处理我们可能需要的输入,所以唯一的另一个主要问题是速度。而且(令我惊讶的是),OpenCV的cv2.merge()
函数的速度快了一个数量级:
import cv2
import numpy as np
img = cv2.imread('image.png')
b, g, r = cv2.split(img)
import timeit
times = range(50000)
start_time = timeit.default_timer()
for t in times:
A = cv2.merge([b, g, r])
print("cv2.merge: ", timeit.default_timer() - start_time, "s")
start_time = timeit.default_timer()
for t in times:
A = np.dstack([b, g, r])
print("np.dstack: ", timeit.default_timer() - start_time, "s")
cv2.merge:3.03491634999922724 s
np.dstack:22.386054433998652秒
你的回答很好,所以我将删除我的。谢谢你的详细回答。这帮了大忙。@SanketWagh如果这帮了你的忙,你介意把答案标记为已接受吗?否则,如果您对此有其他问题,请告诉我。@cᴏʟᴅsᴘᴇᴇᴅ 谢谢你的支持;我本来打算把cv2.merge()
作为对你答案的评论,但我决定对差异进行计时,当我看到cv2.merge()
的巨大差异时,我就写了这篇文章。你的答案很好,所以我将删除我的答案。谢谢你提供的详细答案。这帮了大忙。@SanketWagh如果这帮了你的忙,你介意把答案标记为已接受吗?否则,如果您对此有其他问题,请告诉我。@cᴏʟᴅsᴘᴇᴇᴅ 谢谢你的支持;我本来打算把cv2.merge()
作为对您答案的评论,但我决定对差异进行计时,当我看到cv2.merge()
的巨大差异时,我结束了这篇文章。