在科学技术快速发展的今日,图像处理技术在科研、军事、工业生产、卫生、教育等与人类生活息息相关的领域得到广泛的应用。人脸识别、自动驾驶、各种无人服务,这些新兴技术都体现了机器视觉系统正确认知客观世界的重要性。边缘检测是图像处理中最基本却又最困难的一个问题,边缘检测更是实现图像分割、目标识别等图像技术的重要前提。

图像边缘指的是图形周围像素灰度急剧变化的那些像素的集合,是图像最基本的特征。所谓图像边缘检测就是利用灰度值不连续的性质,以灰度突变为基础分割出目标区域,检测出符合边缘特性的边缘像素,完成图像处理。

1. 经典边缘检测方法

在经典边缘检测算法中,我们常利用各种微分算子对边缘特征进行提取,以达到图像处理的目的。这些算子包含一阶微分算子,如 Sobel 算子、Prewitt 算子、Roberts 算子、Canny 算子等等;还有二阶微分算子,如 Laplacian 算子、LoG 算子等等。以上这些微分算子最终都能完成边缘检测的任务,各有优势。

1.1 算子在边缘检测中的实际运用

目前,所有具有计算机视觉设计需求的公司都会使用这些算子来进行边缘检测处理,其中我们耳熟能详的就包括腾讯、谷歌、英特尔、英伟达、特斯拉等等。在腾讯的各游戏部门中,通常需要获取场景对应的深度、法线和颜色信息,然后利用边缘检测算子来判断游戏场景的实际情况,之后进行场景渲染;特斯拉发展的自动驾驶技术是通过利用车上配置的传感器将实际场景转换成图像,再利用各个算子进行边缘检测算法处理,实现感知周围环境的效果,达到规避障碍物或变换车道的目的,具体实现方法如下:

1.1.1 利用车载传感器获得车道图像(下图)

1.1.2 使用 Canny 算子得到边缘检测处理结果:

import cv2
import numpy as npdef canyEdgeDetector(image):edged = cv2.Canny(image, 50, 150)return edged

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 imageblack_image = np.zeros_like(image)# Put the Triangular shape on top of our Black image to create a maskmask = cv2.fillPoly(black_image, triangle, 255)# applying mask on original imagemasked_image = cv2.bitwise_and(image, mask)return masked_image

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

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

#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 linex1, 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 thicknesscv2.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 imagey2 = int(y1 * (3.4 / 5))  # some random point at 3/5x1 = 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 linesright_fit = [] # will hold m,c parameters for right side linesfor 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,cparameters = 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 parametersleft_line = getLineCoordinatesFromParameters(image, left_fit_average)
right_line = getLineCoordinatesFromParameters(image, right_fit_average)return np.array([left_line, right_line])

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

image = cv2.imread("3d21d93f722e1e3a5dd8fd8bbcd1c5d0.png") #Load Imageedged_image = canyEdgeDetector(image) # Step 1
roi_image = getROI(edged_image) # Step 2lines = 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)

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

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

1.2.1 Roberts 算子

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

1.2.2 Prewitt 算子

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

1.2.3 Sobel 算子

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

1.2.4 Laplacian 算子

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. 量子算法的登场

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

4.1 量子算法的实现原理:

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

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

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

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

第一步:图像预处理

  1. 将需要进⾏图形边缘检测的图⽚,通过 Image.open ⽅式打开,并转换成灰度图(Lmodeimage)存储

  2. 读出存储的灰度图,并剪切⾄算法可以处理的⼤⼩:256×256

  3. 将像素值不⾜ 0.5 的设置为 0,⼤于 0.5 的设置为 1

  4. 将 256×256 ⼤⼩的图⽚,分割成 16×16 的图⽚堆

img = Image.open('./test.jpeg').convert('L')
img.save('grey.png')
image256 = plt.imread("grey.png")
res = cv2.resize(image256, dsize=(256, 256),
interpolation=cv2.INTER_CUBIC)
res[res\<.5] = 0
res[res\>.5] = 1
crop = crop_image(res)
cropped = crop.image_stack
plot_image(res,"original image")

第二步:量子 QED 实例化

  1. 对每⼀个图⽚堆中的 16×16 的分割⼦图,我们使⽤ QED 算法,得到分割后的图像

  2. 对图⽚堆中的每⼀个⼦图完成循环,我们得到⼀个边缘检测之后的图⽚堆 image_out

  3. ⽣成⼀张和原图像⼀样⼤⼩的 error_correction 图⽚,⽤于像素值校正

  4. 最后边缘检测的结果,即为 image_edge+error_correction

image_out = np.zeros(cropped.shape)
for i in range(len(cropped)):  if (np.sum(cropped[i])>0) * (np.sum(cropped[i])<256):  method = QED(image_in = cropped[i])  out = method.get_scan_images()  image_out[i] = out[2]
image_edge = crop.reshape(image_out)
error_correction = np.ones((256,256))
for i in range(1,16):  error_correction[i*16-1] = 0  for j in range(1,16):  error_correction[:,j*16-1] = 0  plot_image(image_edge*error_correction,"edge detected image")

可以看到,经过处理后的图像边缘处理是非常清晰的,说明量子算法在图像处理上会比传统的边缘检测效果更好。同时我们还将量子算法与传统边缘检测数据进行了对比(下图),我们发现在所花费的时间上,量子算法确实快了很多,同时随着边缘检测图片像素数量的增加,量子算法所具有的优势会越来越明显。

5. 量子算法未来的发展

现阶段,量子算法在图像边缘检测上的优势已经初见成效,启科量子作为量子领域的先行者,会在量子算法领域深耕,大大加快量子算法在应用方面的实验工作,发挥量子算法在计算机视觉方向等领域上的全部潜能,为行业发展做出应有的贡献。同时,启科量子也会借着量子领域的东风,积极探索,勇敢尝试,努力实现企业价值,不遗余力地为量子算法以及量子计算领域的发展添砖加瓦。

文章转载自启科量子开发者社区,欢迎关注!

注:部分图片及内容来源于网络,如有侵权,请联系删除。

参考链接:

  1. https://blog.csdn.net/qq_42722197/article/details/119583862

  2. https://blog.csdn.net/zaishuiyifangxym/article/details/89840396

  3. https://blog.csdn.net/simonyucsdy/article/details/106529258

  4. https://www.dounaite.com/article/6261531a1ca8a644a40db371.html

  5. Xi-Wei Yao. Quantum Image Processing and Its Application to Edge Detection: Theory and Experiment. Physical Review X 7,031041(2017)

  6. 王敏杰.图像边缘检测技术综述[J].中南大学学报(自然科学版).2011.9

  7. 王军敏.基于多尺度小波变换的图像边缘检测[J].平顶山学院学报.2013

​​​​​​​

图像边缘检测的新方向——量子算法相关推荐

  1. 【图像边缘检测】基于蚁群算法实现图像边缘检测matlab代码

    1 简介 目的提出基于蚂蚁算法的图像分割技术,解决传统的图像分割算法分割图像的效果不理想.不能满足图像分割要求等问题.方法将图像的灰度.梯度和邻域特征组合成蚂蚁,通过MATLAB实现蚁群图像分割算法对 ...

  2. 主流图像边缘检测算法

    前言:最近在学习关于图像边缘检测技术,更新此博文仅为 了记录个人学习过程,也供有共同志趣的朋友参考! 本文内容包括:图像噪声添加与去除.几种滤波算法[高斯滤波,方框滤波,均值滤波,中值滤波,双边滤波, ...

  3. 百度吴恩达:图像和音视频搜索是人工智能新方向

     百度吴恩达:图像和音视频搜索是人工智能新方向 作者:吴恩达 未来论坛创立大会今天在北京举行.本届大会的主题是"指数Exponential --通向明天的技术力量(The power o ...

  4. sobel算子原理_「学术论文」基于Sobel算法图像边缘检测的FPGA实现

    摘要: 针对嵌入式软件无法满足数字图像实时处理速度问题,提出用硬件加速器的思想,通过FPGA实现Sobel边缘检测算法.通过乒乓操作.并行处理数据和流水线设计,大大提高算法的处理速度.采用模块的硬件设 ...

  5. 【边缘检测】基于matlab八方向sobel图像边缘检测【含Matlab源码 1865期】

    ⛄一.八方向Sobel算子的边缘检测算法简介 1 引言 随着数字图像的广泛应用, 对图像精度的要求也逐步提高.边缘是目标图像与背景图像的分界, 是图像最基本的特征之一.图像边缘蕴含了图像丰富的内在信息 ...

  6. 量子计算机 模拟,新量子算法将量子模拟器变成量子计算机,可以进行量子计算...

    一项研究发现了一种新的量子计算通用模型,即变分模型,填补了量子模拟器与传统量子计算机之间的空白. 研究于3月10日发表在<物理评论A>上,标题为"Universal variat ...

  7. caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf

    自适应canny算法研究及其在图像边缘检测中的应用.pdf 还剩 51页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容 ...

  8. 谷歌开源了量子算法框架CIRQ,拥抱NISQ新时代

    量子栗 发自 凹非寺  量子位 报道 | 公众号 QbitAI NISQ,是嘈杂中型量子 (Noisy Intermediate-Scale Quantum) 的简称. 今年年初,美国人John Pr ...

  9. C语言数字图像处理----3.2 图像边缘检测之Canny边缘检测算法

    本篇将介绍图像边缘检测中的Canny边缘检测,这是传统边缘检测学习中的必学内容,也是图像算法面试中的常见问题,本文将教会初学者如何在理解算法的基础之上,通过C语言来实现Canny边缘检测算法,从而做到 ...

  10. 图像边缘检测--OpenCV之cvCanny函数

    图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

最新文章

  1. PyTorch框架:(1)基本处理操作
  2. 如何在Windows上做Python开发?微软出了官方教程(附链接)
  3. mongo下面总是缺少那么几个好用的工具--------试试这个吧-----MongoDB管理工具
  4. jmeter --上传文件
  5. Zabbix的snmp监控
  6. 跟益达学Solr5之使用Tika从PDF中提取数据导入索引(转字:http://www.tuicool.com/articles/JfUfaey)
  7. 四十四、ETL工具的查询_连接和映射
  8. 如何把Kubernetes config view里的base64编码过后的secret信息还原
  9. leetcode 145 --- 二叉树后序遍历
  10. Linux下如何查看tomcat是否启动
  11. 再见!“一代神机”iPhone 6或将于今年5月停产 iPhone 7/8降至3500档
  12. 真机调试时部分日志丢失(魅族)
  13. python语法(二)——截取字符串的方法详解
  14. webgl之helloworld
  15. eclipse下的mybatis插件:MyBatipse
  16. maven+scala和java_maven打包scala+java工程
  17. 附加:下半部分sql语句 区/县(数据表)
  18. TwinCAT3入门使用经验
  19. imp-00017 oracle 942,IMP导入遇到IMP-00017,ORA-00942
  20. 生如夏花之灿烂,死如秋叶之静美

热门文章

  1. 饥荒服务器运行时cpu的占用,饥荒联机版服务器卡顿原因分析及解决教程_饥荒联机版服务器卡顿怎么解决_游戏堡...
  2. MQL5 COOKBOOK: 获取仓位属性
  3. 大数据下的图片类别以及图片爬取详细的过程(一)
  4. 两个ROS系统进行通信(通过路由器,可上网)
  5. 绿色版Mysql数据库快速搭建
  6. SI4463的数据冲撞解决办法
  7. javascript手册安卓版_JavaScript 手册
  8. jxls对比_13、进阶之Jxls2与Jxls1的历史问题
  9. 银行IT架构变迁史(金融IT基础架构)
  10. mysql 定义外键并增删改查_MYSQL增删改查添加外键