将 img 转换为灰色错误,元组超出范围

transforming img to gray error, tuple out of range

我正在使用我在网上找到的这个函数,它的 add_speckle() 函数可以为图像添加散斑噪声:

def add_speckle(k,theta,img):
  
  gauss = np.random.gamma(k,theta,img.size)
  gauss = gauss.reshape(img.shape[0],img.shape[1],img.shape[2]).astype('uint8')
  noise = img + img * gauss  

我也在使用这种方法将我的图像转换为灰色图像,注意:这种方法有助于将更改后的图像保持为数组形式,而无需为它们提供类似 jpg 或 png 的格式,方法 :

def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [0.2989, 0.5870, 0.1140])
if __name__ == '__main__':
    file_name = os.path.join('/content/img5.jpg') 
    img = rgb2gray(plt.imread(file_name))

问题是当我在我的噪声图像上应用 rgb2gray 时,或者当我 运行 这个命令不久时:

new_img = add_speckle(1,1,img)

发生错误,其消息如下:

IndexError                                Traceback (most recent call last)
<ipython-input-89-d596c78bc99d> in <module>()
      8 
      9 # img = cv2.imread('/content/img1.jpg')
---> 10 img1_g1 = add_speckle(1,1,img)
     11 img1_g2 = add_speckle(8,8,img)
     12 img1_g3 = add_speckle(22,22,img)

<ipython-input-83-df0363dc14bb> in add_speckle(k, theta, img)
      2 
      3   gauss = np.random.gamma(k,theta,img.size)
----> 4   gauss = gauss.reshape(img.shape[0],img.shape[1],img.shape[2]).astype('uint8')
      5   noise = img + img * gauss

IndexError: tuple index out of range

怎么办,我真的需要帮助,因为我不需要任何其他灰度变换方法,因为通常它们包含需要保存或处理路径和目录的图像,而这种方法让我处理只有数组形式的图像(无格式:jpg,png..etc),让你知道问题的根源是相同的add_speckle()函数,因为它产生图像,enter code here不是灰度形式。

提前感谢大家:)

您正在从 RGB 转换为灰度图像,但您的噪声添加假设图像是 RGB。您收到 out-of-bounds 错误,因为 NumPy 数组的形状是 2D,但您假设它是 3D。由于灰度转换,情况并非如此。要成为 channel-agnostic,请不要显式访问 shape 参数。事实上,您不需要重塑数组。它已经达到您期望的大小。请注意,您需要使用 shape 属性,而不是 size:

def add_speckle(k,theta,img):
    gauss = np.random.gamma(k,theta,img.shape)
    noise = img + img * gauss.astype(img.dtype)
    return noise

这里额外的复杂之处在于将嘈杂的对应物转换为与输入图像相同的形式,以尊重在相同类型的两个数组之间执行的算术,但应注意不要溢出数据类型。我没有在这里明确检查过这个,我把它留给你自己解决。