2017-01-26 946 views
0

我對python很陌生,目前正在研究一個類的邊緣檢測程序(具體地說,我正在檢測街道線)。cv2.imwrite在從np.array保存到JPG時改變顏色

我在圖像中讀取並檢測一些邊緣(通過hough)。然後將檢測到的邊緣放置在原始圖像上。在這個過程中,圖像數據被存儲爲numpy.ndarry。 最後,我想將圖像保存爲光盤(如JPG格式)。

如果我通過scipy.misc.imsave將圖像寫入光盤,一切工作正常。 如果我通過cv2.imwrite來完成,顏色會變成一種熱圖。

我已經閱讀了不同顏色通道和必要的縮放/轉換的幾個主題,但我找不到從numpy.ndarray到.jpg的解決方案。 我知道.jpg可能只有8bit或16bit的顏色通道,但不知道從哪裏開始。無論如何,我已經盲目地試圖用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

您還可以附加生成的輸出嗎?根據我的直覺,你試圖保存在磁盤上的圖像的'RGB'或'BGR'格式必定存在一些問題。 'cv2.imwrite()'希望輸入圖像爲'BGR'格式,但我不確定'scipy.misc.imsave'的輸入格式。 – ZdaR

+0

@Marcel你可以上傳你正在使用的圖像嗎? –

+0

嘿,我附上了一張前後圖片! –

回答

4

@ZdaR你是對的,cv2.imwrite需要BGR。我只包含以下行:

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

現在這種輸出的圖像只是罰款:

cv2.imwrite(new_file_name, image_to_write) 

謝謝! 現在,我不會接受我自己的答案作爲解決方案;也許有人有一個更全面的,他或她想發佈。

+0

我想知道圖像的RGB顏色通道是否是圖像處理步驟之一或圖像處理步驟之一的結果。使用draw_lines和depict_lines函數,我正在創建一個新的陣列。從numpy.ndarray的信息創建的圖像的默認顏色通道是什麼? –

+0

你現在可以接受你的答案。如果你遇到更好的答案,你可以改變它。 –

+0

@MarcelB:請接受你的回答。 Opencv將圖像作爲BGR存儲在內存中(非硬盤)。只是肯定。 – saurabheights