使用Python和OpenCV从图像中提取区域

62 投票
3 回答
74874 浏览
提问于 2025-04-17 17:04

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

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);从每个通道中切出这个区域,然后再把它们合并回去,但我觉得应该有更简单的方法。

3 个回答

1

最好的方法是使用:
img2 = cv2.cvtColor(img , cv2.COLOR_BGR2RGB)

这段代码会把BGR格式的'img'数组转换成RGB格式的'img2'数组。现在你可以用img2数组来显示图像,使用matplotlib库里的imshow()函数。

参考链接:cvtColor

50

还有两个没有提到的选项:

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

以及这个多功能的

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
147

在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:

在这里输入图像描述

撰写回答