Как я могу заменить `plt.imsave` с параметром` cmap`, установленным на `grey`, с операциями opencv? - PullRequest
0 голосов
/ 12 января 2020

Это исходное изображение, с которым я работаю:

source image for lane segmentation

Я использую этот репозиторий github (файл I Я использую это tools/test_lanenet.py), чтобы сделать бинарную сегментацию полосы. теперь я получаю это изображение:

Binary image resulted after operations

Второе изображение фактически является изображением, полученным из этой команды:

# this line results in an array with the shape of (512, 256). this is just a hypothetical line of code. what I really care is the line which saves the image with matplotlib library. 
binary_seg_image = lane_segmenter.binary_segment()
# this line saves the image
plt.imsave('binary_image_plt.png', binary_seg_image[0] * 255, cmap='gray')

Первый I необходимо выполнить ту же операцию с модулем opencv и желательно быстрее.

В следующей операции мне нужно отобразить полосы, сегментированные во втором изображении, на дорожки с исходным изображением. Я думаю, что я должен использовать второе изображение в качестве маски и использовать cv2.bitwise_and, чтобы сделать работу правильно? Кто-нибудь может мне помочь?

спасибо, ребята

Ответы [ 2 ]

1 голос
/ 12 января 2020

Если вы хотите раскрасить изображение там, где существует маска, то это один из способов, используя Python / OpenCV. Вместо bitwise_and вам просто нужно сделать numpy раскраску, где маска белая. Обратите внимание, что ваши изображения имеют разный размер, и я не знаю, как лучше их выровнять. Я оставляю это тебе. Я использую ваши два входных изображения, как в моем другом ответе. Код почти такой же.

import cv2
import numpy as np

# read image
img = cv2.imread('road.png')
ht, wd, cc = img.shape
print(img.shape)

# read mask as grayscale
gray = cv2.imread('road_mask.png', cv2.IMREAD_GRAYSCALE)
hh, ww = gray.shape
print(gray.shape)

# get minimum dimensions
hm = min(ht, hh)
wm = min(wd, ww)
print(hm, wm)

# crop img and gray to min dimensions
img = img[0:hm, 0:wm]
gray = gray[0:hm, 0:wm]

# threshold gray as mask
thresh = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)[1]
print(thresh.shape)

# apply mask to color image
result = img.copy()
result[thresh==255] = (0,0,255)

cv2.imshow('image', img)
cv2.imshow('gray', gray)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('road_colored_by_mask.png', result)


enter image description here

0 голосов
/ 12 января 2020

Ваши изображения не одного размера. Чтобы замаскировать черно-белое изображение на цветное изображение, их необходимо выровнять. Я попытался просто обрезать их до тех же минимальных размеров в верхнем левом углу, но это не выровняло их должным образом.

Однако этот код Python / OpenCV даст вам представление о том, как начать, когда вы поймете, как их выровнять.

Цветовой ввод:

enter image description here

B / W Lane Image:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('road.png')
ht, wd, cc = img.shape
print(img.shape)

# read mask as grayscale
gray = cv2.imread('road_mask.png', cv2.IMREAD_GRAYSCALE)
hh, ww = gray.shape
print(gray.shape)

# get minimum dimensions
hm = min(ht, hh)
wm = min(wd, ww)
print(hm, wm)

# crop img and gray to min dimensions
img = img[0:hm, 0:wm]
gray = gray[0:hm, 0:wm]

# threshold gray as mask
thresh = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)[1]
print(thresh.shape)

# make thresh 3 channels as mask
mask = cv2.merge((thresh, thresh, thresh))

# apply mask to color image
result = cv2.bitwise_and(img, mask)

cv2.imshow('image', img)
cv2.imshow('gray', gray)
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.imshow('masked image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('road_masked_on_black.png', result)


enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...