opencv python 图像处理 使用高斯滤波+cv2.adaptiveThreshold+canny算法 进行轮廓提取得到contours 在contours提取出面积不小于一定阈值threshold_area且两边接近平行于x轴、两边接近平行于y轴的矩形轮廓contour_rec 同时进行霍夫变化cv2.HoughLinesP得到直线lines 遍历lines 得到x1, y1, x2, y2 ,然后计算直线的斜率:slope = abs((y2 - y1) / (x2 - x1 + 0.001)) # 防止分母为0 通过直线的斜率筛选出相对水平与相对垂直的线:if slope > 5.5 or slope<0.17: # 如果斜率大于5.5,则认为是垂直线段 用筛选出相对水平与相对垂直的线去与对比矩形轮廓 若直线大部分与轮廓贴合 则画出该轮廓 能帮我用代码示例嘛
时间: 2023-06-27 07:05:26 浏览: 151
当然可以,以下是代码示例:
```
import cv2
import numpy as np
# 读取图像
img = cv2.imread('test.jpg')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 自适应阈值化
th = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
# Canny边缘检测
edges = cv2.Canny(th, 30, 150)
# 轮廓提取
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓
for contour in contours:
# 计算轮廓面积
area = cv2.contourArea(contour)
# 过滤面积小于阈值的轮廓
if area < threshold_area:
continue
# 计算轮廓外接矩形
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)
# 计算外接矩形的长宽
width = rect[1][0]
height = rect[1][1]
# 过滤长宽比例不合适的矩形
if width / height > 5 or height / width > 5:
continue
# 霍夫变换检测直线
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 50, minLineLength=50, maxLineGap=10)
# 遍历直线
for line in lines:
x1, y1, x2, y2 = line[0]
# 计算直线斜率
slope = abs((y2 - y1) / (x2 - x1 + 0.001))
# 过滤斜率不合适的直线
if slope > 5.5 or slope < 0.17:
continue
# 判断直线是否与矩形贴合
if abs(y2 - y1) > abs(x2 - x1):
# 直线接近水平,判断是否与矩形上下两条边贴合
if abs(y1 - box[0][1]) < 10 or abs(y1 - box[1][1]) < 10:
# 绘制矩形
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
break
else:
# 直线接近垂直,判断是否与矩形左右两条边贴合
if abs(x1 - box[0][0]) < 10 or abs(x1 - box[1][0]) < 10:
# 绘制矩形
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
break
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码中需要自己定义阈值`threshold_area`,表示过滤掉面积小于该值的轮廓。
阅读全文