在 Python、OpenCV 中使用切片从图像中提取区域

Posted

技术标签:

【中文标题】在 Python、OpenCV 中使用切片从图像中提取区域【英文标题】:Extracting a region from an image using slicing in Python, OpenCV 【发布时间】:2013-02-10 22:29:21 【问题描述】:

我有一张图片,我想从中提取一个区域。我有这个区域的左上角和右下角的坐标。在灰度中,我这样做:

I = cv2.imread("lena.png")
I = cv2.cvtColor(I, cv2.COLOR_RGB2GRAY)
region = I[248:280,245:288]
tools.show_1_image_pylab(region)

我不知道如何用彩色来做。我想提取每个通道R,G,B;从每个通道中切出该区域并将它们重新合并在一起,但必须有更短的方法。

【问题讨论】:

这本身也适用于彩色图像。 在将图像转换为灰度之前尝试一下 也许您可以使用GetRectSubPix() 来获取区域而不是切片。 我刚刚测试过了。我得到了彩色图像本身。使用 cv2.imshow() 函数显示图像,而不是任何 pylab 或 matplotlib 函数,它只是显示在不同的颜色图中。 如果您对此有疑问,请检查 region.shape 并确保其格式为 [rows,cols,3] 【参考方案1】:

最好的方法是使用:- img2 = cv2.cvtColor(img , cv2.COLOR_BGR2RGB) 这会将 BGR 'img' 数组转换为 RGB 'img2' 数组。现在您可以将 img2 数组用于 matplotlib 的 imshow() 函数。

参考链接:-cvtColor

【讨论】:

【参考方案2】:

还有 2 个尚未提及的选项:

img[..., ::-1] # same as the mentioned img[:, :, ::-1] but slightly shorter

多才多艺

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

【讨论】:

【参考方案3】:

OpenCV 和 Matplotlib 中的像素排序略有不同。

OpenCV 遵循 BGR 顺序,而 matplotlib 可能遵循 RGB 顺序。

因此,当您使用 pylab 函数显示在 OpenCV 中加载的图像时,您可能需要将其转换为 RGB 模式。 (我不确定是否有任何简单的方法)。下面的方法演示一下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('messi4.jpg')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.subplot(121);plt.imshow(img) # expects distorted color
plt.subplot(122);plt.imshow(img2) # expect true color
plt.show()

cv2.imshow('bgr image',img) # expects true color
cv2.imshow('rgb image',img2) # expects distorted color
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:请查看下面@Amro 的评论,了解 BGR 和 RGB 之间更好的转换方法。 img2 = img[:,:,::-1] 。很简单。

运行此代码并亲自查看结果的差异。以下是我得到的:

使用 Matplotlib:

使用 OpenCV:

【讨论】:

你可以这样做:img2 = img[:,:,::-1] 将颜色维度从 BGR 翻转为 RGB(仅使用 NumPy 索引) +1 - 是的,你是对的,它会比我的回答更快。感谢您的评论。 (我只是想具体展示一下 r 和 b 通道的翻转。) 实现该结果的另一种方法是使用 cv2.cvtColorcv2.COLOR_BGR2RGB 标志。 这个怎么样? cv2.imshow = lambda _, y: plt.imshow(y[:,:,::-1]).figure 它是img2 = img[::,::-1]

以上是关于在 Python、OpenCV 中使用切片从图像中提取区域的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 的 OpenCV 函数裁剪图像 [重复]

在 Python 中使用 Opencv 从图像中减去背景

使用 python/opencv/深度学习从图像中删除给定位置的徽标/水印

Python 和 OpenCV - 改进我的车道检测算法

Python从图像opencv中提取多个对象

使用opencv python从图像中提取多个ROI