Как извлечь только сети из изображения стойки ворот?

#python #opencv #graphics #cv2

#python #opencv #графика #cv2

Вопрос:

Каков наилучший способ сохранить только сети на изображении, приведенном ниже, и превратить зеленоватый цвет в черный?

Я попробовал следующее, но это не работает хорошо.

 img_file = os.path.join(data_dir, img_file_name)
img = cv2.imread(img_file)
plt.figure()
plt.imshow(img)


hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

sensitivity = 150
lower_white = np.array([0,0,255-sensitivity])
upper_white = np.array([255,sensitivity,255])

# Threshold the HSV image to get only white colors
mask = cv2.inRange(hsv, lower_white, upper_white)
# Bitwise-AND mask and original image
res = cv2.bitwise_and(img,img, mask= mask)
  

введите описание изображения здесь

Ответ №1:

Извините за C , но это просто иллюстрация идеи: RGB -> HSV -> Порог для канала насыщенности -> маска с каналами насыщенности и значений -> RGB. Код здесь:

 cv::Mat img = cv::imread("cMzGr.jpg");
cv::Mat hsv;
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);
std::vector<cv::Mat> chans;
cv::split(hsv, chans);

cv::Mat mask;
cv::adaptiveThreshold(255 - chans[1], mask, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 9, 0);
cv::bitwise_and(mask, chans[2], mask);

std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(mask, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);

for (size_t i = 0; i < contours.size();   i)
{
    if (cv::contourArea(contours[i]) < 10)
    {
        cv::drawContours(mask, contours, i, cv::Scalar(0), cv::FILLED, cv::LINE_4, hierarchy);
    }
}


cv::bitwise_and(chans[1], mask, chans[1]);
cv::bitwise_and(chans[2], mask, chans[2]);
cv::merge(chans, hsv);
cv::cvtColor(hsv, img, cv::COLOR_HSV2BGR);

cv::imshow("mask", mask);
cv::imshow("res", img);
  

И результат:
введите описание изображения здесь