Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中统一分割图像?_Python_Opencv_Numpy - Fatal编程技术网

如何在python中统一分割图像?

如何在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有一个函数可以做

我用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有一个函数可以做到这一点。它可以合并任意数量的通道。此外,我们也会做同样的事情

您还可以使用
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()
的巨大差异时,我结束了这篇文章。