contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 如何判断轮廓的主要部分是否在图像左上角原点的30像素的矩形区域内若左上角存在轮廓。则保留下来,并将其他区域变为黑色
时间: 2024-03-20 18:43:09 浏览: 58
可以通过计算轮廓的重心来判断轮廓的主要部分是否在矩形区域内。如果重心在矩形区域内,则说明轮廓的主要部分也在矩形区域内。
具体步骤如下:
1. 对每个轮廓,计算其重心坐标。可以使用 `cv2.moments()` 函数来计算轮廓的矩和重心。
2. 判断轮廓的重心是否在矩形区域内。如果在,则保留轮廓;否则将轮廓所在的区域变为黑色。可以使用 `cv2.drawContours()` 函数来绘制轮廓,并使用 `cv2.fillPoly()` 函数将轮廓所在的区域填充为黑色。
3. 对于左上角存在轮廓的情况,可以将其与其他轮廓分开处理。首先计算左上角轮廓的重心,判断是否在矩形区域内。如果在,则保留该轮廓,并将其他轮廓所在的区域变为黑色;否则将左上角轮廓所在的区域变为黑色。
完整的代码如下:
```
import cv2
import numpy as np
image = cv2.imread("image.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
rect_x = 0
rect_y = 0
rect_w = 30
rect_h = 30
# 计算左上角轮廓的重心
top_left_contour = None
for contour in contours:
for point in contour:
x, y = point[0]
if x < rect_w and y < rect_h:
if top_left_contour is None:
top_left_contour = contour
else:
top_left_contour = np.concatenate((top_left_contour, contour), axis=0)
if top_left_contour is not None:
moments = cv2.moments(top_left_contour)
cx = int(moments["m10"] / moments["m00"])
cy = int(moments["m01"] / moments["m00"])
if cx >= rect_x and cx <= rect_x + rect_w and cy >= rect_y and cy <= rect_y + rect_h:
# 左上角轮廓的重心在矩形区域内,保留该轮廓,并将其他轮廓所在的区域变为黑色
for contour in contours:
if contour is not top_left_contour:
cv2.fillPoly(mask, [contour], 0)
else:
# 左上角轮廓的重心不在矩形区域内,将左上角轮廓所在的区域变为黑色
cv2.fillPoly(mask, [top_left_contour], 0)
else:
# 左上角没有轮廓,将所有轮廓所在的区域变为黑色
cv2.fillPoly(mask, contours, 0)
# 对每个轮廓进行处理
for contour in contours:
moments = cv2.moments(contour)
cx = int(moments["m10"] / moments["m00"])
cy = int(moments["m01"] / moments["m00"])
if cx >= rect_x and cx <= rect_x + rect_w and cy >= rect_y and cy <= rect_y + rect_h:
# 轮廓的重心在矩形区域内,保留该轮廓
cv2.drawContours(image, [contour], 0, (0, 0, 255), 2)
else:
# 轮廓的重心不在矩形区域内,将轮廓所在的区域变为黑色
cv2.fillPoly(mask, [contour], 0)
# 将黑色区域应用到原图像上
image[mask == 0] = 0
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
阅读全文