边缘提取 python
时间: 2023-11-05 07:59:46 浏览: 156
基于最大旋转角的点云边缘提取(基于python语言编写)
边缘提取是图像处理中常用的技术,可以用于检测图像中物体的边界。在Python中,可以使用Prewitt算子和Roberts算子来实现边缘提取。
Prewitt算子的实现过程与Roberts算子比较相似。首先,需要将图像转换为灰度图像,然后定义Prewitt算子的卷积核,通过调用OpenCV的filter2D()函数对灰度图像进行卷积运算。接着,使用convertScaleAbs()函数将卷积结果转换为8位无符号整数,并使用addWeighted()函数对水平和垂直方向的边缘强度进行加权求和。最后,通过matplotlib库将原始图像和Prewitt算子的边缘提取结果显示出来。
以下是Prewitt算子边缘提取的Python代码示例:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('lena.png')
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 灰度化处理图像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Prewitt算子
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int)
kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
# 转uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Prewitt = cv2.addWeighted(absX,0.5,absY,0.5,0)
# 用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
# 显示图形
titles = [u'原始图像', u'Prewitt算子']
images = [lenna_img, Prewitt]
for i in xrange(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
```
Roberts算子的实现过程与Prewitt算子类似,只是卷积核的定义有所不同。以下是Roberts算子边缘提取的Python代码示例:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('lena.png')
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 灰度化处理图像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Roberts算子
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
# 转uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX,0.5,absY,0.5,0)
# 用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
# 显示图形
titles = [u'原始图像', u'Roberts算子']
images = [lenna_img, Roberts]
for i in xrange(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
```
你可以根据自己的需求选择使用Prewitt算子还是Roberts算子来进行边缘提取。同时,你也可以在github上找到完整的源代码,链接为:https://github.com/eastmountyxz/ImageProcessing-Python。
希望以上内容能够帮助到你!如果你还有其他问题,请随时提问。
阅读全文