Как извлечь только сети из изображения цели? - PullRequest
0 голосов
/ 02 апреля 2019

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

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

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)

enter image description here

1 Ответ

0 голосов
/ 02 апреля 2019

Извините за 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);

И результат: enter image description here

...