图像边缘检测的新方向——量子算法【文末送书】_量子图像处理

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

def canyEdgeDetector(image):
edged = cv2.Canny(image, 50, 150)
return edged


![](https://img-blog.csdnimg.cn/img_convert/383b965bd409f1df57a823b076778bc9.png)


**1.1.3 在处理后的图像上,根据实际需求,定义需要关注的区域。**



def getROI(image):
height = image.shape[0]
width = image.shape[1]
# Defining Triangular ROI: The values will change as per your camera mounts
# triangle = np.array([[(100, height), (width, height), (width-500, int(height/1.9))]])
triangle = np.array([[(120, height), (width, height), (400, 228)]])
# creating black image same as that of input image
black_image = np.zeros_like(image)
# Put the Triangular shape on top of our Black image to create a mask
mask = cv2.fillPoly(black_image, triangle, 255)
# applying mask on original image
masked_image = cv2.bitwise_and(image, mask)
return masked_image


![](https://img-blog.csdnimg.cn/img_convert/9cf4da8c5515f79544d22280adfe3970.png)


**1.1.4 为了分析路况及车道情况,我们要获得图像中的所有直线,通过以下代码完成:**



def getLines(image):
# lines=cv2.HoughLinesP(image,bin_size,precision,threshold,dummy 2d array–no use,minLineLength,maxLineGap)
# lets take bin size to be 2 pixels
# lets take precision to be 1 degree= pi/180 radians
# threshold is the votes that a bin should have to be accepted to draw a line
# minLineLength --the minimum length in pixels a line should have to be accepted.
# maxLineGap --the max gap between 2 broken line which we allow for 2 lines to be connected together.
lines = cv2.HoughLinesP(image, 0.3, np.pi/180, 100, np.array([]),minLineLength=70, maxLineGap=20)
return lines


![](https://img-blog.csdnimg.cn/img_convert/21e7e3781afeb2ec8044c7409fde2d0c.png)


**再通过以下程序获取图像和线条列表,并在图像上绘制出线条:**



#display lines over a image
def displayLines(image, lines):
if lines is not None:
for line in lines:
# print(line) --output like [[704 418 927 641]] this is 2d array representing [[x1,y1,x2,y2]] for each line
x1, y1, x2, y2 = line.reshape(4) # converting to 1d array []

        # draw line over black image --(255,0,0) tells we want to draw blue line (b,g,r) values 10 is line thickness
        cv2.line(image, (x1, y1), (x2, y2), (255, 0, 0), 10)
return image

**定义另一个效用函数从斜率和截距中获取线坐标**



def getLineCoordinatesFromParameters(image,
line_parameters):
slope = line_parameters[0]
intercept = line_parameters[1]
y1 = image.shape[0] # since line will always start from bottom of image
y2 = int(y1 * (3.4 / 5)) # some random point at 3/5
x1 = int((y1 - intercept) / slope)
x2 = int((y2 - intercept) / slope)
return np.array([x1, y1, x2, y2])


**1.1.5 将上述得到的直线进行分组,分组后找到各组的平均斜率和截距,并通过算法为每个组创建一条线。**



#Avergaes all the left and right lines found for a lane and retuns single left and right line for the the lane
def getSmoothLines(image, lines):
left_fit = [] # will hold m,c parameters for left side lines
right_fit = [] # will hold m,c parameters for right side lines

for line in lines:
    x1, y1, x2, y2 = line.reshape(4)
    # polyfit gives slope(m) and intercept(c) values from input points
    # last parameter 1 is for linear..so it will give linear parameters m,c
    parameters = np.polyfit((x1, x2), (y1, y2), 1)
    slope = parameters[0]
    intercept = parameters[1]

if slope < 0:
    left_fit.append((slope, intercept))
else:
    right_fit.append((slope, intercept))

take averages of all intercepts and slopes separately and get 1 single value for slope,intercept

axis=0 means vertically…see its always (row,column)…so row is always 0 position.

so axis 0 means over row(vertically)

left_fit_average = np.average(left_fit, axis=0)
right_fit_average = np.average(right_fit, axis=0)

now we have got m,c parameters for left and right line, we need to know x1,y1 x2,y2 parameters

left_line = getLineCoordinatesFromParameters(image, left_fit_average)
right_line = getLineCoordinatesFromParameters(image, right_fit_average)

return np.array([left_line, right_line])


![](https://img-blog.csdnimg.cn/img_convert/3dbc7cc9f80bd34eca5f5c1ad67ffc2e.png)


**1.1.6 经过上述所有步骤的处理之后,我们就通过 Canny 算子进行的边缘检测处理获得了单独的函数,我们只需要在主代码中调用它们,就能够通过车载图传获得车道信息进行下一步的处理。**



image = cv2.imread(“3d21d93f722e1e3a5dd8fd8bbcd1c5d0.png”) #Load Image

edged_image = canyEdgeDetector(image) # Step 1
roi_image = getROI(edged_image) # Step 2

lines = getLines(roi_image) # Step 3
image_with_lines = displayLines(image, lines)

cv2.imshow(“Output”, roi_image)

cv2.waitKey(0)

smooth_lines = getSmoothLines(image, lines) # Step 5

image_with_smooth_lines = displayLines(image, smooth_lines) # Step 4

cv2.imshow(“Output”, image_with_smooth_lines)

cv2.waitKey(0)


![](https://img-blog.csdnimg.cn/img_convert/64dd86f75120f3cc9e9eced30f489460.png)


#### 1.2 各个算子边缘检测能力的区别


通过上述边缘检测算法完成车道分析之后,自动驾驶系统会很具实际情况判断是否需要变道或者规避障碍物,这就是现在边缘检测在实际应用中所发挥的作用。各个算子在实际操作中,对于图像边缘检测的完成情况也略有不同,具体有什么样的区别,我们可以看看以下实例:


##### 1.2.1 Roberts 算子


Roberts 算子又称为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正 45 度或负 45 度时,该算法处理效果更理想。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。


![](https://img-blog.csdnimg.cn/img_convert/577117b0f5124634fb4a52275e4c9972.png)


##### 1.2.2 Prewitt 算子


Prewitt 算子是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于 Prewitt 算子采用 33 模板对区域内的像素值进行计算,而 Robert 算子的模板为 22,故 Prewitt 算子的边缘检测结果在水平方向和垂直方向均比 Robert 算子更加明显。Prewitt 算子适合用来识别噪声较多、灰度渐变的图像。


![](https://img-blog.csdnimg.cn/img_convert/b5560b61ff89e875e08398fa2fdc7404.png)


##### 1.2.3 Sobel 算子


Sobel 算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel 算子在 Prewitt 算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。Sobel 算子的边缘定位更准确,常用于噪声较多、灰度渐变的图像。


![](https://img-blog.csdnimg.cn/img_convert/e72db80a6c0be356a8d8db8da85b218e.png)


##### 1.2.4 Laplacian 算子


Laplacian 算子是维欧几里德空间中的一个二阶微分算子,通过灰度差分计算邻域内的像素。Laplacian 算子其实主要是利用 Sobel 算子的运算,通过加上 Sobel 算子运算出的图像 X 方向和 Y 方向上的导数,得到输入图像的图像锐化结果。同时,在进行 Laplacian 算子处理之后,还需要调用 convertScaleAbs()函数计算绝对值,并将图像转换为 8 位图进行显示。Laplacian 算子容易丢失一部分边缘的方向信息,造成一些不连续的检测边缘,同时抗噪声能力比较差,由于其算法可能会出现双像素边界,常用来判断边缘像素位于图像的明区或暗区,很少用于边缘检测。


![](https://img-blog.csdnimg.cn/img_convert/f6e47b396114285ceab9cb6a7f26f9f9.png)


### 2. 经典边缘检测技术新发展


随着数学理论和人工智能技术的发展,经典边缘检测还结合了很多相关领域内的理论知识形成了一些新的检测方法,以下是这些新方法中较为常见的几个例子:


#### 2.1 基于数学形态学的边缘检测:


数学形态学是基于积分几何和几何概论建立的关于图像形状和尺寸的研究方法,实质上是一种非线性滤波方法。数学形态学的方法应用于视觉图像的处理就是用具有一定形状、大小的结构元素去探测、度量和提取图像中对应形状,以达到对图像进行处理、分析识别的目的。在图像处理的过程中,主要使用的是二值形态学和灰度形态学。我们可以来看看这个方法对于图像轮廓的提取能力如何:


![](https://img-blog.csdnimg.cn/img_convert/830722e34663d3eccc2b12c62108c920.png)


![](https://img-blog.csdnimg.cn/img_convert/09106a7add1714823943882bae6a5a9e.png)


#### 2.2 基于小波和小波包变换的边缘检测算法:


小波变换具有非常丰富的数学理论做支撑,有着非常大的发展前景;小波变换很好的利用了时域频域的局部化特征,通过对信号进行细化分析,能达到高频处时间细分、低频处频率细分,所以小波变换适合复杂图像的边缘检测,它的边缘处理能力如下:


![](https://img-blog.csdnimg.cn/img_convert/02d9e65ec5e6d579295dd817279e42d8.png)


#### 2.3 基于模糊理论的边缘检测算法:


实际应用中的图像边缘是不确定的,具有模糊性,用经典数学描述不准确,所以利用模糊理论进行边缘检测时,首先将图像看作是一个模糊集,将图像中每一个具有特定灰度级的元素进行标记,从而将待处理的图像映射为具有模糊特征的矩阵,在此基础上进行模糊增强处理,由于图像边缘梯度的模糊性,这个方法能够得到比较好的边缘检测效果。下图就是模糊方法处理后得到的图像边缘:


![](https://img-blog.csdnimg.cn/img_convert/a9e8a7fa6cb32c03be8c939c5db28df8.png)


#### 2.4 基于神经网络的边缘检测算法:


神经网络是一种基于现有数据创建预测的计算系统,随着神经网络技术的发展,人们又将其加入到图像边缘检测中,希望能够获得更好的检测结果。神经网络的边缘检测一般利用 BP 网络,采用滚动训练和权值随机扰动方法,提高了神经网络的学习效果,获得的边缘图像封闭性好,更加精确。我们来看看它实际的处理能力:


![](https://img-blog.csdnimg.cn/img_convert/c495e8f1cecd2e75e2bbb5f933cd4d66.png)


除了上述的微分算子边缘检测及发展出的几个新方法外,还有很多领域的研究人员结合自己的理论知识提出了不少新算法,比如基于分形几何的边缘检测算法、基于遗传算法的边缘检测算法、漫射边缘检测方法、多尺度边缘检测技术、亚像素边缘定位技术、FCM 聚类的边缘检测算法等等,都能够取得较好的图像边缘检测效果。


### 3. 经典边缘检测的实际应用及局限


随着图像边缘检测技术的完善和发展,它的成果早已经融入到我们生活的方方面面。我们平时使用的手机面容解锁,数码相机的眼部追踪和自动对焦功能,翻译软件的拍照识别翻译,停车场车牌号检测,文字识别等等,都运用到了图像的边缘检测技术。在很多专业领域内,都依赖于图像边缘检测技术带来的成果,比如在医疗领域,B 超、CT 的分析也是依靠图像边缘检测完成的,像无人驾驶等等领域也都有它的身影。可以说,我们已经享受到很多边缘检测技术带来的便利。


目前所有在使用的传统图像边缘检测算法在大部分时间内可以满足我们工作生产的需求,但它们都不具备绝对优势,一个好的边缘检测方法一方面要求能够检测出有效边缘,另一方面要求其抗噪能力强,目前的经典边缘检测算法或多或少都会遇到噪声的影响,如椒盐噪声、高斯噪声等等;同时在实际生活中,当我们碰到尺寸、分辨率更大的图像时,经典边缘检测算法必须要对像素逐个进行计算,这就带来了很大的工作量和巨大的时间成本。


### 4. 量子算法的登场


在更高效率的需求下,很多人将目光转向了量子算法领域。随着量子力学和信息科学的发展,基于量子信号处理的图像处理研究是目前图像处理的前沿。如果我们采用量子算法进行图像边缘检测,依托于量子态叠加和量子纠缠带来的巨大并行计算的能力,量子图像处理与经典图像处理相比具有天然的优势,能为图像边缘检测带来指数级的加速。


#### 4.1 量子算法的实现原理:


在使用量子算法进行图像边缘检测时,首先我们需要将图像各个像素归一化,让每个像素的概率加权等于 1,然后让这些像素矢量转化成为比特字串,经过一个置换酉阵,我们就可以检测像素矢量的梯度了,之后的工作就是找到像素从明变化到暗的位置,这就是我们需要的图像边缘所在的点。(下图所示为量子电位图)


![](https://img-blog.csdnimg.cn/img_convert/04370b1f2aef068487a5ed2698e926a9.png)


#### 4.2 量子算法进行边缘检测的步骤:


具体操作步骤如下图所示:算法的输入量,是一张处理好的 256×256 的灰度图,像素点的值在 0 到 1 之间。之后图片会被分割成 1024 张 16×16 的子图,对每一张子图,我们创建格式相同的两个量子电路,分别用于处理子图的横向边缘扫描和纵向边缘扫描,扫描的结果,是一张 16×16 的横向扫描图和一张 16×16 的纵向扫描图的和,即为这张子图对应的图像边缘。当我们对这 1024 张子图全部进行上述的步骤后,将得到的 1024 张扫描结果进行重构,得到一张 256×256 的完整灰度图,这张图即为输出结果。处理时的具体步骤如下图所示:


![](https://img-blog.csdnimg.cn/img_convert/e1ded9fa97b153a80ded7133b018d8c9.png)


#### 4.3 量子算法完成边缘检测的步骤代码


完成量子算法检测边缘步骤所需要的算法代码如下:



from edge_detection import QED,crop_image,plot_image
import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt


**第一步:图像预处理**



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/50b5775cafa07114858737067ecb7530.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

s np
import matplotlib.pyplot as plt

第一步:图像预处理

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-ZbdchvDl-1713385003298)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值