目录:
1、用 Canny 算子检测图像轮廓提取车道线任务(Canny)
2、用 findContours 发现硬币轮廓任务(Canny+findContours)
3、用概率霍夫变换检测车道线任务(Canny+HoughLines)
4、用最小二乘法拟合车道线任务(Canny+HoughLines+fitLine)
5、用形态学操作提取水平和垂直直线任务(自适应阈值+形态学操作)
6、提取连续区域 物体识别和检测任务(findContours+约束过滤)
7、扫描文档自动切边任务(Canny+findContours+约束过滤)
代码基于:opencv-python (3.4.0.12)
1. 用 Canny 算子检测图像轮廓
介绍: 使用 Canny 算子,需要指定两个阈值,基于两个阈值获得二值分布图的策略(滞后阈值化)。 在低阈值边缘分布图上值保留具有连续路径的边缘点, 同时把那些边缘点连接到属于高阈值边缘分布图的边缘上, 高阈值的边缘点被保留下来,低阈值分布图上的孤立点全部被移除。
import cv2
from PIL import Image
def canny_test():
raw_ = cv2.imread("1.jpg")
raw = cv2.cvtColor(raw_,cv2.COLOR_BGR2RGB)
raw_gray = cv2.cvtColor(raw,cv2.COLOR_RGB2GRAY)
edges = cv2.Canny(raw_gray,125,350)
image1 = Image.fromarray(raw.astype('uint8')).convert('RGB')
display(image1)
image2 = Image.fromarray(edges.astype('uint8')).convert('RGB')
display(image2)
canny_test()
2. 发现轮廓
介绍:是基于图像边缘提取基础寻找对象轮廓的方法, 边缘提取的阈值选定会影响最终轮廓发现结果。
步骤: - 输入图像转为灰度图像 - 使用 Canny 进行边缘提取, 得到二值图像 - 使用 findContours 寻找轮廓 - 使用 drawContours 绘制轮廓
import cv2
from PIL import Image
import numpy as np
def findContours_test():
raw_ = cv2.imread("2.jpg")
image1 = Image.fromarray(raw_.astype('uint8')).convert('RGB')
display(image1)
raw_gray = cv2.cvtColor(raw_ ,cv2.COLOR_BGR2GRAY)
#全部发现的轮廓对象,该图的拓扑结构
edges = cv2.Canny(raw_gray,100,200,apertureSize=3)
image2 = Image.fromarray(edges.astype('uint8')).convert('RGB')
display(image2)
_,counts,hierarchy = cv2.findContours(edges, #输入图像
cv2.RETR_TREE, #轮廓返回模式
cv2.CHAIN_APPROX_NONE) #发现方法
cv2.drawContours(raw_, #一个三通道图像
counts, #全部发现的轮廓
-1, #轮廓索引号 -1就是绘制所有轮廓
(255,0,0), #轮廓颜色
1) #宽度
image3 = Image.fromarray(raw_.astype('uint8')).convert('RGB')
display(image3)
findContours_test()