2017-01-26 4 views
0

저는 Python을 처음 접했고 현재 클래스의 가장자리 감지 프로그램에서 작업하고 있습니다 (구체적으로 거리 선을 감지하고 있음).np.array에서 JPG로 저장할 때 cv2.imwrite의 색이 바뀝니다.

이미지를 읽고 일부 가장자리를 감지합니다 (거친 곳을 통해). 검출 된 가장자리는 원본 이미지 위에 배치됩니다. 이 과정에서 이미지 데이터는 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) 

마지막으로, 나는 디스크에 이미지를 저장 : 414,다음, 나는 원래 이미지와 가장자리를 포함하는 하나의 결합. 이 기능은 잘 작동하는 반면

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 색상 채널이 'code' image = mpimg.imread (img)'code' 또는 이미지 처리 단계 중 하나의 결과인지 궁금합니다. draw_lines 및 묘화 라인 함수를 사용하여 배열에서 새로운 이미지를 생성합니다. numpy.ndarray의 정보로 생성 된 이미지의 기본 색상 채널은 무엇입니까? –

+0

지금 답변을 수락하실 수 있습니다. 더 나은 대답을 발견하면 변경할 수 있습니다. –

+0

@MarcelB : 답변을 수락하십시오. Opencv는 이미지를 BGR로 메모리에 저장합니다 (하드 디스크가 아님). 그냥 확인해. – saurabheights