灰度图像Python实现

4
我试图使用Python将RGB图像转换为灰度图像作为函数,但问题是我给它一个具有高度、宽度和通道的RGB图像,但在代码后,我应该得到一个仅具有高度和宽度的图像,但它却给了我一个具有高度、宽度和通道的图像,为什么?
def RGBtoGRAY(img):
    height, width, channels = img.shape
    grayimg = img
    for i in range(height):
        for j in range(width):
            grayimg[i,j] = 0.3 * image[i,j][0] + 0.59 * image[i,j][1] +  0.11 * image[i,j][2]
    return grayimg

输入图像的尺寸为

image.shape 
(533, 541, 3)

输出图像的大小是

grayimage.shape 
(533, 541, 3)

通常我想在输出图像的尺寸中查找。
(533, 541)

2
grayimg = img 并没有创建一个新的图像,它只是获取输入图像的引用。您需要创建一个具有相同尺寸的新图像。 - Jean-François Fabre
例如,https://dev59.com/LloU5IYBdhLWcg3wsYbM 有帮助吗? - Karl Knechtel
2个回答

3
当进行图像处理时,应避免使用for循环,因为效率非常低。相反,可以使用Numpy进行高度优化的向量操作。使用这个灰度转换公式
gray = R * .299 + G * .587 + B * .114

方法 #1:apply_along_axis

import cv2
import numpy as np

def grayscale(colors):
    r, g, b = colors
    return 0.299 * r + 0.587 * g + 0.114 * b

# Create image of size 100x100 of random pixels
# Convert to grayscale
image = np.random.randint(255, size=(100,100,3),dtype=np.uint8)
gray = np.apply_along_axis(grayscale, 2, image)

# Display
cv2.imshow('image', image)
cv2.imshow('gray', gray)
cv2.waitKey()

之前 -> 之后

enter image description here enter image description here

方法 #2:cv2.cvtColor

您可以直接使用OpenCV并通过将cv2.IMREAD_GRAYSCALE0标志传递给cv2.imread来将图像读入为灰度。

image = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE) # OR
# image = cv2.imread('img.png', 0)

如果您已经加载了图像,可以使用cv2.cvtColor将RGB或BGR图像转换为灰度。
image = cv2.imread('img.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

0
假设您正在使用for循环,因为您打算“手动”解决它(就像C代码一样),那么您的实现存在许多问题:
  • 在Python中,赋值grayimg = img并不会创建img的副本(结果是grayimg引用了img)。
    你应该使用:grayimg = img.copy()
  • img3个维度,因此当使用grayimg = img时,grayimg也有3个维度。
    你需要创建一个只有两个维度的grayimg
    创建grayimg并初始化为零的示例:

    grayimg = np.zeros((height, width), img.dtype)
    
  • 在for循环内部,你使用了image而不是img

这是一个修正后的RGBtoGRAY版本:

def RGBtoGRAY(img):
    height, width, channels = img.shape
    #grayimg = img
    # Create height x width array with same type of img, and initialize with zeros.
    grayimg = np.zeros((height, width), img.dtype)
    for i in range(height):
        for j in range(width):
            grayimg[i,j] = 0.3 * img[i,j][0] + 0.59 * img[i,j][1] +  0.11 * img[i,j][2]
    return grayimg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接