Python 使用numpy将图像转换为灰度
我有一个由三元组组成的矩阵nxm表示的图像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
(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()