Python 中将 3 通道 rgb 彩色图像更改为 1 通道灰色的速度有多快?

Posted

技术标签:

【中文标题】Python 中将 3 通道 rgb 彩色图像更改为 1 通道灰色的速度有多快?【英文标题】:How fast in Python change 3 channel rgb color image to 1 channel gray? 【发布时间】:2017-01-31 20:03:52 【问题描述】:

我在包含原始像素数据的 4D 数组中有近 40000 张图像 - (示例数、宽度、高度、通道)。每个图像的宽度为 32 像素,高度为 32 像素,RGB 颜色有 3 个通道。我想将它们更改为灰度图像(从 3 个带有 rgb 的通道得到 1 个强度)。我怎么能做得很快? 我的代码:

import pickle
import cv2
training_file = "/train.p"

with open(training_file, mode='rb') as f:
train = pickle.load(f)
X_train = train['features']

def rgb2gray(rgb):
    r, g, b = rgb[0], rgb[1], rgb[2]
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
return gray

X_train_gray = X_train.copy()

for i in range (X_train_gray.shape[0]):
    for j in range (X_train_gray.shape[1]):
        for k in range (X_train_gray.shape[2]):
            rgb = X_train_gray[i,j,k]
            gray = rgb2gray(rgb)
            X_train_gray[i,j,k] = gray

print("X_train image data shape =", X_train.shape)
print("X_train_grey image data shape =", X_train_gray.shape)

结果: X_train_grey 图像数据形状 = (40000, 32, 32, 3) X_train_grey 图像数据形状 = (40000, 32, 32, 1) 这很好,但需要很多时间。

我也试过用cv2:

X_train_gray = X_train[0].copy()
print("X_train_grey image data shape =", X_train_gray.shape)
X_train_gray = cv2.cvtColor(X_train_gray, cv2.COLOR_BGR2GRAY)
print("X_train_grey image data shape =", X_train_gray.shape)

结果: X_train_grey 图像数据形状 = (32, 32, 3) X_train_grey 图像数据形状 = (32, 32) 但我失去了强度,不知道如何获得它。 那么如何快速地将这些图像从 3 通道 rgb 更改为 1 通道灰度?

【问题讨论】:

【参考方案1】:

如果你可以使用 PIL。应该没问题。我有 RGB 图像并将它们转换:

from PIL import Image
img = Image.open("image_file_path") #for example image size : 28x28x3
img1 = img.convert('L')  #convert a gray scale
print(img1.size)
>> (28,28)

但是图片没有频道

y = np.expand_dims(img1, axis=-1)
print(y.shape)
>> (28,28,1)

【讨论】:

【参考方案2】:

我以前遇到过这个问题。这是最好的方法: 您的代码是正确的,但需要进行更多更改才能适合灰度图像。这是代码:

ii = cv2.imread("0.png")
gray_image = cv2.cvtColor(ii, cv2.COLOR_BGR2GRAY)
print(gray_image)
plt.imshow(gray_image,cmap='Greys')
plt.show()

结果如下:

[[196 196 197 195 195 194 195 197 196 195 194 194 196 194 196 189 188 195 195 196 197 198 195 194 194 195 193 191] . . . [194 194 193 193 191 189 193 193 192 193 191 194 193 192 192 191 192 192 193 196 199 198 200 200 200 201 200 199]]

【讨论】:

【参考方案3】:

尝试使用:

cv::cvtColor(gray_img,color_img,CV_GRAY2BGR)

【讨论】:

以上是关于Python 中将 3 通道 rgb 彩色图像更改为 1 通道灰色的速度有多快?的主要内容,如果未能解决你的问题,请参考以下文章

python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波

OpenCV RGB直方图计算与绘制----calcHist()函数normalize()函数

Python 计算机视觉 —— 数字图像处理基础

Opencv如何使用MatIterator迭代具有浮点RGB值的彩色图像?

16位图像的65536种颜色是指彩色,还是灰度(灰阶)?

彩色图像转为灰度图像