如何只提取目标帖子图像中的网?

问题描述 投票:0回答:1

在下面给出的图像中,只保留网并将绿色变成黑色的好方法是什么?

我试过以下但是效果不好。

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

python opencv graphics cv2
1个回答
0
投票

很抱歉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

© www.soinside.com 2019 - 2024. All rights reserved.