OpenCV-Python简单轮廓寻找

OpenCV-Python

img


图链接:https://pan.quark.cn/s/2b31ac50f685
第二个图

img


图链接:https://pan.quark.cn/s/4446377f1b85
寻找那个最明显的绿色轮廓

我的解答思路和尝试过的方法
import cv2

hgy = cv2.imread("C:/Users/cxryj/Pictures/hgy.png")
# cv2.imshow("hgy", hgy)
hgy_gray = cv2.cvtColor(hgy, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(hgy_gray, 127, 255, cv2.THRESH_BINARY)
_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
hgy_copy = hgy.copy()
hgy_gray_copy = hgy_gray.copy()
cv2.drawContours(hgy_copy, contours, -1, (255, 0, 0), 3)
cv2.imwrite("C:/Users/cxryj/Pictures/res.png", hgy_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()

img


这个我设置成找到的轮廓标记为蓝色,但是包含了一大堆轮廓

我想要达到的结果

各位老哥,如何使用OpenCV在Python下找出这个最大的绿色轮廓,是纯绿【BGR(0,255,0)】的,或者如果找不出来,我可以换这个轮廓的颜色,最好在现在这个颜色下能实现。
找到这个轮廓内的图像,然后去掉轮廓外面的部分,就处理轮廓以内的部分,这部分可以用掩膜操作解决。
感谢


import cv2

# 加载图像
img = cv2.imread("preview_png.png")

# 提取 G 通道
imgG = img.copy()  # BGR
imgG[:, :, 0] = 0  # B=0
imgG[:, :, 2] = 0  # R=0
# cv2.imshow("Green channel", imgG)
# cv2.waitKey(0)

gray = cv2.cvtColor(imgG, cv2.COLOR_BGR2GRAY)
# cv2.imshow("Gray image", gray)
# cv2.waitKey(0)

# 在二值图像中寻找轮廓
ret, binary = cv2.threshold(gray, 85, 255, cv2.THRESH_BINARY)
# cv2.imshow("binary", binary)
# cv2.waitKey(0)

# binary, contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)  # OpenCV3
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # OpenCV4~

cnts = sorted(contours, key=cv2.contourArea, reverse=True)  # 所有轮廓按面积排序
cnt = cnts[0]  # 面积最大的轮廓
imgCnt = img.copy()
cv2.drawContours(imgCnt, cnts, 0, (0,0,255), 5)  # 绘制面积最大的轮廓

cv2.imshow("contour", imgCnt)
cv2.waitKey(0)

img

既然是纯绿,直接用像素值(0,255,0)找不可以吗?对你contours中的点用1,3通道为0过滤。

该回答引用ChatGPT
请参考下面的解决方案,如果有帮助,还请点击 “采纳” 感谢支持!

使用OpenCV-Python寻找图像中最明显的绿色轮廓的代码如下:

import cv2
import numpy as np

# 加载图像
img = cv2.imread('image.jpg')

# 将图像从BGR颜色空间转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义HSV中绿色颜色的范围
lower_green = np.array([45, 100, 50])
upper_green = np.array([75, 255, 255])

# 对HSV图像进行阈值化,仅保留绿色部分
mask = cv2.inRange(hsv, lower_green, upper_green)

# 在二值图像中寻找轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 寻找面积最大的轮廓
max_area = 0
max_contour = None
for contour in contours:
    area = cv2.contourArea(contour)
    if area > max_area:
        max_area = area
        max_contour = contour

# 在原始图像上绘制最大的绿色轮廓
cv2.drawContours(img, [max_contour], 0, (0,255,0), 3)

# 显示图像
cv2.imshow('最大绿色轮廓图像', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


我们可以使用以下代码来读取图像并寻找其轮廓:

import cv2
import numpy as np

读取图像
img = cv2.imread("image.jpg")

转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

寻找轮廓
contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

画出轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

显示图像
cv2.imshow("Contours", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先读取了图像,然后将其转换为灰度图像。接下来,我们使用cv2.findContours函数寻找图像中的轮廓。最后,我们使用cv2.drawContours函数在图像上画出轮廓,并使用cv2.imshow函数显示图像。

这就是如何使用OpenCV-Python来寻找图像中的轮廓的简单实现。希望这篇文章对您有所帮助!

提供参考实例,链接:https://blog.csdn.net/qq_33757398/article/details/96174768