작성
·
143
0
안녕하십니까,
이게 opencv에서 한번에 가능한 함수가 있는지 잘 모르겠군요.
제 생각에 이렇게 하시면 될것 같은데 테스트는 해보지 않았습니다.
먼저 segmentation inference 결과인 mask 이미지 array가 있을 때
mask_array = inference_segentation결과 반환 array
해당 mask_array에서 값이 0 이상인 위치 인덱스를 뽑아내서 non_zero_indexes에 저장합니다.
non_zero_indexes = np.where(mask_array > 0 )
다음에 원본 이미지 array를 org_img_array라고 하면 원본 이미지의 해당 non_zero_indexes 위치에 있는 원소값을 모두 0으로 만듭니다.
org_img_array[non_zero_indexes] = 0
이렇게 하면 원본 이미지에서 segmentation mask결과 영역만 검은색으로 표시됩니다.
이제 덮어 씌우려는 새로운 이미지를 해당 영역만 제외하고 나머지 영역은 mask를 적용하듯이 모두 0으로 만듭니다. 이렇게 만든 새로운 이미지를 new_img_array라고 하겠습니다.
그런 다음 opencv의 add() 연산을 이용하여 org_img_array와 new_img_array를 더하면 원하시는 이미지가 만들어 질것 같습니다.
added_new_img_array = cv2.add(org_img, array, new_img_array)
감사합니다.
에 관한 질문입니다!!
안녕하세요 선생님 너무 감사하게도 친절한 답변을 남겨주신 덕분에 실습을 잘 진행하고 있는 학생입니다.
다름이 아니라 알려주신 코드로 실습을 진행하는 와중에 궁금한 점이 생겨 질문드립니다.
위에서 봐주신 코드를 제가 이해하기론
mask_array = inference_segentation결과 반환 array
=> mask_array = s_mask_b (object 를 감지한 결과를 원본 이미지만큼 scale out 한 배열)
non_zero_indexes = np.where(mask_array > 0 )
=> non_zero_indexes = np.where(mask_array > 0 ) (mask 배열값 중 object라고 인지한 인덱스의 배열)
org_img_array[non_zero_indexes] = 0
=> draw_img = img.copy()
draw_img[non_zero_indexes] (원본 이미지를 복사한 배열 중 object라고 인지한 인덱스의 배열을 0으로 만듦)
가 맞나요?
답변 1
0
네, 지난번에 적어드린 코드가 pseudo code긴 한데, 이해하신 부분이 대부분 맞습니다.
그리고 mask_array = s_mask_b
를 object 를 감지한 결과를 원본 이미지만큼 scale out 한 배열이라고 적어주셨는데 mask_array는 scale out한 배열은 아닙니다.
mask_array는 원본 이미지의 사이즈와 크기가 동일한 array입니다. 다만 원본 이미지는 3차원이지만 mask_array는 2차원 입니다. MMDetection을 이용한 Mask RCNN Inference 실습 - Masking inference 반환 결과 분석 강의 영상을 다시 보시면 mask inferece 결과값이 어떻게 되는지 확인 하실 수 있습니다.
그리고 non_zero_indexes = np.where(mask_array > 0 )를 하게 되면 tuple 값이 반환되는데 detect 된 object의 instance segmentation 행과 열의 좌표값을 가지게 됩니다. 그래서 원본 이미지에 해당 instance segmentation 영역을 검은색(0값)으로 표시하려면
non_zero_indexes = np.where(mask_array > 0 )
draw_img = img.copy()
draw_img[non_zero_indexes[0], non_zero_indexs[1], :] = 0 하시면 됩니다.