图像分割

 

目的:

掌握基于 openCV 的图像分割方法,理解图像分割的处理

 

 

 

原理:

边缘检测方法:

边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映 了属性的重要事件和变化。 这些包括:

(i)深度上的不连续

(ii)表面方向不连续

(iii)物质属性变化

(iv)场景照明变化。

 

主要有以下三种方法:

Sobel 算子检测方法对灰度渐变和噪声较多的图像处理效果较好,但对边缘定位不是很 准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方 法。

 

Canny 方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的 阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像 中。

 

Laplacian 算子检测方法对噪声比较敏感,所以很少用该算子做检测边缘,而是用来判 断边缘像素视为与图像的明区还是暗区。拉普拉斯算子是一种二阶导数算子,将在边缘处产 生一个陡峭的零交叉, Laplacian 算子是各向同性的,能对任何走向的界线和线条进行锐化, 无方向性。这是拉普拉斯算子区别于其他算法的最大优点。

 

最优边缘检测:

好的检测- 算法能够尽可能多地标识出图像中的实际边缘。

好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。

最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

 

霍尔变换:

将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值 对应的解,那么这个解就对应着要寻找的几何形状的参数。

主要作用如下:用于分离图像中特殊形状的特征;可以容忍特征边界描述的误差,并且 不受噪声的干扰;广泛用于条形码扫描、验证和识别。

 

 

内容或步骤:

对“lena.jpg”或“车牌.jpg” 的灰度图像分别进行如下操作:

 

(1)先平滑滤波,进行 Canny 边缘检测(请尝试使用不同参数,调试效果),显 示并保存图像;

 

代码:

 

import cv2

 

def main():

img=cv2.imread(r'.\lena.jpg',cv2.IMREAD_GRAYSCALE) img1=cv2.blur(img,(1,1))

img3=cv2.blur(img,(3,3)) img5=cv2.blur(img,(5,5)) img7=cv2.blur(img,(7,7))

#同一滤波,不同阈值

# cv2.imshow("img3_0_1",cv2.Canny(img3,0,1))

# cv2.imshow("img3_1_255",cv2.Canny(img3,1,255))

# cv2.imshow("img3_255_999",cv2.Canny(img3,255,999))

#同一阈值,不同滤波

# cv2.imshow("img_50_150",cv2.Canny(img,50,150))

# cv2.imshow("img1_50_150",cv2.Canny(img1,50,150))

# cv2.imshow("img3_50_150",cv2.Canny(img3,50,150))

# cv2.imshow("img5_50_150",cv2.Canny(img5,50,150))

# cv2.imshow("img7_50_150",cv2.Canny(img7,50,150))

cv2.waitKey()

 

if  name  =='  main  ': main()

 

 

思路与讨论:

以 cv2.IMREAD_GRAYSCALE 格式读取 lena.jpg,使其以灰度图形式呈现,再 用 cv2.blur()函数做滤波处理使其平滑化,然后利用 cv2.Canny()函数进行边缘检 测处理,将亮度变化明显的点进行标识,将图像的边缘进行显示,最后用 cv2.imwrite()进行保存。

可以看到的是滤波方式的选择和阈值设置的高低对于结果都有着比较明显 的改变。故在进行边缘处理时选择合适的滤波方式与阈值长度均比较重要。

 

 

 

 

 

 

 

 

 

 

(2)在 1)的基础上,进行 Hough 直线变换(尝试使用不同参数,调试效果) , 描绘显示并保存图像。

 

 

 

 

 

代码:

 

 

import cv2

import numpy as np

def main():

img=cv2.imread(r'.\license_plate.jpg',cv2.IMREAD_GRAYSCALE) img3=cv2.blur(img,(3,3))#改变滤波方式 img3_Canny=cv2.Canny(img3,100,400)#改变边缘处理方式 lines=cv2.HoughLines(img3_Canny,1,np.pi/180,130)#改变直线检测阈值

 

result_img=img.copy()

for line in lines: rho,theta=line[0]

if(theta<(np.pi/4)) or (theta >(3*np.pi/4)):#垂直直线

#该直线与第一行的交点

pt1=(int(rho/np.cos(theta)),0)

#该直线与最后一行的交点

pt2=(int((rho- result_img.shape[0]*np.sin(theta))/np.cos(theta)),result_img.shape[0]

)

#绘制一条白线

cv2.line(result_img,pt1,pt2,255,3)

else:#水平直线

# 该直线与第一列的交点

pt1=(0,int(rho/np.sin(theta)))

#该直线与最后一列的交点

pt2=(result_img.shape[1],int((rho- result_img.shape[1]*np.cos(theta))/np.sin(theta)))

#绘制一条白线

cv2.line(result_img,pt1,pt2,255,3) cv2.imshow("Canny",img3_Canny) cv2.imshow("Hough",result_img) cv2.waitKey()

 

if  name  =='  main  ': main()

 

 

思路与讨论:

 

利用(1)中的处理方式对图片做基础处理,然后利用 cv2.HoughLines()函 数对图片做直线检测后利用 cv2.line()函数画出直线(具体操作见代码注释,结 合小结里对于 HoughLines()函数的解释进行理解),之后利用 cv2.imwrite()函数 保存想要的图片即可。

可以看到的是阈值长度改变对于结果有着比较直观的改变,滤波方式与边缘 处理方式则影响相对较小,故在进行直线检测的时候选择合适的直线阈值长度比 较重要。

 

 

 

 

实验小结:

 

 

cv2.Canny(…,threshold1,threshold2,…)函数中阈值参数的意义: 1-低于阈值 1 的像素点不会被认为是边缘;

2-高于阈值 2 的像素点会被认为是边缘;

 

3-在阈值 1 和阈值 2 之间的像素点,若与 2 中得到的边缘像素点相邻,则 被认为是边缘,否则被认为不是边缘。

 

 

cv2.HoughLines(img3_Canny,1,np.pi/180,130):

 

返回(ρ,θ)值的序列,ρ 为单位像素,θ 为单位弧度(lines:lines[i][0]为第 i 条直 线的 rho,lines[i][1]表示第 i 条直线的 theta)。

第 1 个参数,输入的图片是一个二进制图片,在使用 hough 变换之前,应用 阈值或使用 canny 边缘检测。

 

第 2 和第 3 个参数分别是 ρ(rho:像素精度,一般设置为 1;)和 θ 的精度

 

(theta:角度精度,一般设置为 CV_PI/180)。

 

第 4 个参数是阈值,指可以被认为是一条直线的最小计数值。由于计数值的 多少取决于线上的点数(threshold:表示累计的像素达到多少才能形成直线),所 以这代表了可以被识别为线的最小长度。

 

 

 

 

参考博客https://blog.csdn.net/zhouzongzong/article/details/93767441

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值