Я делаю проект, в котором нам нужно сделать сегментацию окна машины изнутри машины. Я работаю с OpenCV , но это не обязательно. (Также python или C ++ в порядке)
До сих пор у меня есть некоторые (не очень хорошие) результаты. Я следовал этой последовательности:
1) Применить cv2.grabCut()
в области интереса, где windows может быть.
import cv2
import numpy as np
from matplotlib import pyplot as plt
#Read Image
img = cv2.imread("test1.png",-1)
#Grab Cut iterations
itera = 30
p1 = True
if p1: # This takes quite long so this helps when debugging
gb_mask_w1 = np.zeros(img.shape[:2],np.uint8) #output mask
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (1,12,390,845) #ROI of window 1
cv2.grabCut(img,gb_mask_w1,rect,bgdModel,fgdModel,itera,cv2.GC_INIT_WITH_RECT)
# 0-pixels and 2-pixels are put to 0 (ie background) and all 1-pixels and
# 3-pixels are put to 1(ie foreground pixels).
mask_w1 = np.where((gb_mask_w1==3),0,1).astype('uint8') #
gb_mask_w2 = np.zeros(img.shape[:2],np.uint8)#output mask
rect_1 = (1500,12,323,820) #ROI of window 2
cv2.grabCut(img,gb_mask_w2,rect_1,bgdModel,fgdModel,itera,cv2.GC_INIT_WITH_RECT)
# 0-pixels and 2-pixels are put to 0 (ie background) and all 1-pixels and
# 3-pixels are put to 1(ie foreground pixels).
mask_w2 = np.where((gb_mask_w2==3),0,1).astype('uint8')
2) Эрозия на пикселях переднего плана, чтобы иметь чистые (er) края
# Morphological Operations
kernel = np.ones((10,10),np.uint8)
eroded_w1 = cv2.erode(mask_w1,kernel,iterations = 1)
eroded_w2 = cv2.erode(mask_w2,kernel,iterations = 1)
3) Aplpy cv2.fastNlMeansDenoising()
, чтобы избежать артефактов
# DeNoise artifacts
mask_w1_porc = cv2.fastNlMeansDenoising(eroded_w1)
mask_w2_porc = cv2.fastNlMeansDenoising(eroded_w2)
4) Просто примените получившуюся маску и сюжет
img_treated = img.copy()
# Green background
bskg = np.zeros(img.shape[:3],np.uint8)
bskg[:] = (0, 177, 64)
#Apply mask
img_treated[mask_w1_porc==0] = bskg[mask_w1_porc==0]
img_treated[mask_w2_porc==0] = bskg[mask_w2_porc==0]
#Plot
f,ax=plt.subplots(2,2)
ax[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB ))
ax[0,1].imshow(mask_w1_porc)
ax[1,0].imshow(mask_w2_porc)
ax[1,1].imshow(cv2.cvtColor(img_treated,cv2.COLOR_BGR2RGB ))
Задачи :
Бывает, что фактически обнаруживается только часть окна.
Может случиться так, что части автомобиля будут обнаружены как окно
Очень медленно (~ 20 секунд на окно)
Что-то работает?
Что я хочу?
Мне интересно, что я могу добавить к этому конвейеру, чтобы улучшить обнаружение окон => фильтр, чтобы упростить работу cv2.grabCut()
?
Может быть там есть пост т путь?
Я избегаю машинного обучения или искусственного интеллекта, потому что мы работаем с не очень мощным компьютером. Но я открыт для этих идей
Я добавляю график, чтобы вы могли видеть результаты (Исходное изображение, маски и вывод): ![Output from all that code](https://i.stack.imgur.com/hW1PK.png)
[Редактировать]:
Я также выкладываю изображение с окклюзией (которое не кажется таким неудачным, но является причиной обнаружения windows вместо фиксированных масок)
![Image with occlusion](https://i.stack.imgur.com/zfl6M.jpg)