图像运算和图像增强九

图像运算和图像增强九

图像锐化之 Roberts、Prewitt 算子实现边缘检测

(1)图像锐化

图像锐化的目的是为了使图像的边缘、轮廓线以及图像的细节变得清晰,经过平滑的图像变得模糊的根本原因是图像受到了平均或积分运算,因此可以对其进行逆运算,从而使图像变得清晰。图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础。
(2)Roberts算子
Roberts 算子又称为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

  • dst 表示输出的边缘图,其大小和通道数与输入图像相同
  • ddepth 表示目标图像所需的深度
  • kernel 表示卷积核,一个单通道浮点型矩阵
  • anchor 表示内核的基准点,其默认值为(-1,-1),位于中心位置
  • delta 表示在储存目标图像前可选的添加到像素的值,默认值为 0
  • borderType 表示边框模式
    dst = convertScaleAbs(src[, dst[, alpha[, beta]]])
  • src 表示原数组
  • dst 表示输出数组,深度为 8 位
  • alpha 表示比例因子
  • beta 表示原数组元素按比例缩放后添加的值
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img=cv2.imread('luo.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=['原始图像’,‘Roberts算子’]
images=[lenna_img,Roberts]
for i in range(2):
	plt.subplot(1,2,i+1),plt.imshow(image[i],'gray')
	plt.title(title[i])
	plt.xticks([]),plt.yticks([])
plt.show()

图像运算和图像增强九_第1张图片
(3)Prewitt算子
Prewitt 是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img=cv2.imread('luo.png')
lenna_img=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 = ['原始图像', 'Prewitt 算子'] 
images = [lenna_img, Prewitt] 
for i in range(2):
	plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
	plt.title(titles[i])
	plt.xticks([]),plt.yticks([])
plt.show()

图像运算和图像增强九_第2张图片

你可能感兴趣的:(图像处理,计算机视觉)