从np.array保存到JPG时,cv2.imwrite会更改颜色

时间:2017-01-26 23:44:27

标签: python python-3.x opencv color-channel

我是python的新手,目前正致力于一个类的边缘检测程序(具体来说我正在检测街道线)。

我在图像中读取并检测到一些边缘(通过霍夫)。然后将检测到的边缘放在原始图像上。在此过程中,图像数据存储为numpy.ndarry。 在最后,我想将图像保存到光盘(作为jpg)。

如果我通过scipy.misc.imsave将图像写入光盘,一切正常。 如果我通过cv2.imwrite这样做,颜色会变成一种热图片。

我已经阅读了不同颜色通道和必要的缩放/转换的几个主题,但我找不到从numpy.ndarray到.jpg的解决方案。 我知道.jpg可能只有8位或16位彩色通道,但不知道从那里去哪里。在任何情况下,我都盲目地试图除以255( - >图像几乎是黑色)并乘以255( - >白色热图片:-))。

有什么想法吗?这些是代码的相关部分:

读取图像(稍后在循环中调用函数):

def read(img):
image = mpimg.imread(img)
return image

....

绘制要在循环中调用的函数以绘制数组中定义的所有行

def draw_lines(img, line_coordinates, color=[255, 0, 0], thickness=4):
for line in line_coordinates:
    for x1,y1,x2,y2 in line:
        cv2.line(img, (x1, y1), (x2, y2), color, thickness)

此函数调用绘制函数并返回绘制了所有线条的图像

def depict_lines(img, array_of_coordinates): 
line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
draw_lines(line_img, array_of_coordinates)
return line_img

接下来,我将原始图像与包含边缘的图像合并:

def weighted_img(line_img, initial_img, α=0.95, β=1., λ=0.):
return cv2.addWeighted(initial_img, α, line_img, β, λ)
combined_images = weighted_img(depicted_lines, original_image)

最后,我将图像保存到光盘。这个函数产生奇怪的颜色:

cv2.imwrite(new_file_name, combined_images)

虽然这个功能正常:

scipy.misc.imsave('outfile.jpg', combined_images)

这是一张未经处理的图片: natural colors

加工过的一个: distorted colors

您的帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

@ZdaR你是对的,cv2.imwrite需要BGR。我刚才包括以下一行:

image_to_write = cv2.cvtColor(combined_images, cv2.COLOR_RGB2BGR)

现在输出图像就好了:

cv2.imwrite(new_file_name, image_to_write)

谢谢! 现在,我不会接受我自己的答案作为解决方案;也许某人有一个更全面的,或者他想发布的。