Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy将图像转换为灰度_Python_Arrays_Numpy_Opencv - Fatal编程技术网

Python 使用numpy将图像转换为灰度

Python 使用numpy将图像转换为灰度,python,arrays,numpy,opencv,Python,Arrays,Numpy,Opencv,我有一个由三元组组成的矩阵nxm表示的图像(r,g,b),我想使用我自己的函数将其转换为灰度 我的尝试未能将矩阵nxmx3转换为单值矩阵nxm,这意味着从数组[r,g,b]开始,我得到[gray,gray,gray],但我需要gray i、 e.初始颜色通道:[150 246 98]。 转换为灰色后:[134]。 我需要什么:134 我怎样才能做到这一点 我的代码: def grayConversion(image): height, width, channel = image.sha

我有一个由三元组组成的矩阵nxm表示的图像
(r,g,b)
,我想使用我自己的函数将其转换为灰度

我的尝试未能将矩阵nxmx3转换为单值矩阵nxm,这意味着从数组
[r,g,b]
开始,我得到
[gray,gray,gray]
,但我需要
gray

i、 e.初始颜色通道:
[150 246 98]
。 转换为灰色后:
[134]
。 我需要什么:
134

我怎样才能做到这一点

我的代码:

def grayConversion(image):
    height, width, channel = image.shape
    for i in range(0, height):
        for j in range(0, width):
            blueComponent = image[i][j][0]
            greenComponent = image[i][j][1]
            redComponent = image[i][j][2]
            grayValue = 0.07 * blueComponent + 0.72 * greenComponent + 0.21 * redComponent
            image[i][j] = grayValue
    cv2.imshow("GrayScale",image)
    return image
使用
沿\u轴应用\u的解决方案
解决方案可通过以下方式实现:

例子 10x10图像 我们现在可以开始可视化结果:

文本示例(2x2图像) 为了在文本中显示实际结果,我将使用较小的数组,仅使用2x2图像:

内容是:

让我们使用自定义函数将其转换为灰度:

result = np.apply_along_axis(grayscale, 2, image)
转换的输出为:

array([[127.62263079, 157.64461409],
   [117.94766108, 197.76399547]])
我们也可以使用与上面相同的代码来可视化这个简单的示例:

进一步建议

如果你想应用你自己的自定义函数,那么<代码> Apple yAxangOxAx/Obj>是要走的路,但是你应该考虑使用Upple NoMy方法,如建议的,或者如果可能的话,只需使用<代码> CV2< /Cord>选项加载:黑白图像:< /P>

cv2.imread('smalltext.jpg',0)

您可以使用dot产品:

gray_image = image.dot([0.07, 0.72, 0.21])
甚至只需手动完成整个操作:

b = image[..., 0]
g = image[..., 1]
r = image[..., 2]
gray_image = 0.21 * r + 0.72 * g + 0.07 * b
不要忘记转换回0-255:

gray_image = np.min(gray_image, 255).astype(np.uint8)

以下是工作代码:

def grayConversion(image):
    grayValue = 0.07 * image[:,:,2] + 0.72 * image[:,:,1] + 0.21 * image[:,:,0]
    gray_img = grayValue.astype(np.uint8)
    return gray_img

orig = cv2.imread(r'C:\Users\Jackson\Desktop\drum.png', 1)
g = grayConversion(orig)

cv2.imshow("Original", orig)
cv2.imshow("GrayScale", g)
cv2.waitKey(0)
cv2.destroyAllWindows()

请使用矢量化而不是嵌套for循环。您能详细说明一下吗@QuickBeam2K1我不确定我是否正确理解你的问题。opencv转换到底有什么问题?您想自己实现opencv转换吗?opencv转换没有任何问题。是的,我想要一个二维图像数组来实现我自己的代码。如果我的答案不正确,你能详细说明我遗漏了什么吗?谢谢所以,结果变量应该是灰度图像,对吗?或者我遗漏了什么,因为当我试图显示它时,它只是到处显示白色像素。是的,但他要求使用他自己的自定义函数。给人一种误导性的印象,这会更好,因为它避免了python循环——但python循环正是apply_沿_轴所做的。删除评论,你是对的。@thesamiroli我相信是的。使用cv2灰度加载时会发生什么情况
cv2.imread('smalltext.jpg',0)
?图像仍然是一个三维数组。您的意思是
gray\u image.ndim==3
?在我的机器上是2
gray_image = image.dot([0.07, 0.72, 0.21])
b = image[..., 0]
g = image[..., 1]
r = image[..., 2]
gray_image = 0.21 * r + 0.72 * g + 0.07 * b
gray_image = np.min(gray_image, 255).astype(np.uint8)
def grayConversion(image):
    grayValue = 0.07 * image[:,:,2] + 0.72 * image[:,:,1] + 0.21 * image[:,:,0]
    gray_img = grayValue.astype(np.uint8)
    return gray_img

orig = cv2.imread(r'C:\Users\Jackson\Desktop\drum.png', 1)
g = grayConversion(orig)

cv2.imshow("Original", orig)
cv2.imshow("GrayScale", g)
cv2.waitKey(0)
cv2.destroyAllWindows()