计算机视觉的常用图像处理技术

本篇将介绍常用基于OpenCv等视觉库的影像分割以及图像处理技术,并且附赠源码

一:边检测器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPFfJZrs-1590071543557)(D:\CSDN\pic\医学影像处理(二)\1590051455492.png)]

先复习一下基础的OpenCv操作:如上图:第一张是原图;

第二张是灰度图:

gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)

用法很简单,调包调参嘛,以灰度形式读图,介绍一下灰度转换原理:
RGB是三通道彩色图,在矩阵(图像)中的顺序是B,G,R;GRAY是单通道灰度图
COLOR_BGR2GRAY的原理:

​ GRAY = B * 0.114 + G * 0.587 + R * 0.299

利用CV_RGB2GRAY将原图src转换为灰度图rgb2gray,转换公式Gray = 0.1140R + 0.5870G + 0.2989*B,与CV_BGR2GRAY相比,转换的系数一致,不同的是系数后紧跟的通道的顺序变化了,由BGB变为RGB。

利用CV_GRAY2BGR将bgr2grayImg转换为gray2bgrImg,转换公式B = G = R = Gray

又或者 利用CV_GRAY2RGB将rgb2grayImg转换为gray2rgbImg,转换公式R = G = B = Gray

第三、第四张是sobel算子的横向检测器和纵向检测器(垂直),这个比灰度图就是真的属于调包了:

sobel算子技术,使用的是卷积运算。可以利用sobel算子作用于图像梯度上

sobel算子主要用作边缘检测上,在技术上,他是一个离散型差分算子,用来运算图像高亮度函数的灰度的近似值,在图像中任意一点使用此算子,都会产生对应的灰度矢量或者法向量。

我上面图中没有转化成灰度图后使用sobel算子,现在演示一下灰度图下的sobel算子以及不同Ksize参数下的图案:
在这里插入图片描述
Sobel算子下的图像卷积过程:(正常的卷积过程就不赘述了,建议百度百科,看不懂可以私聊我讨论一下)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u006mGJH-1590071543564)(D:\CSDN\pic\医学影像处理(二)\1590053328316.png)]

第五张图是高斯模糊处理

“模糊”的算法有很多种,其中有一种叫做“高斯模糊”(Gaussian Blur)。它将正态分布(又名”高斯分布”)用于图像处理。 本质上,它是一种数据平滑技术(data smoothing),适用于多个场合,图像处理恰好提供了一个直观的应用实例。

所谓”模糊”,可以理解成每一个像素都取周边像素的平均值。

img

上图中,2是中间点,周边点都是1。

img

“中间点”取”周围点”的平均值,就会变成1。在数值上,这是一种”平滑化”。在图形上,就相当于产生”模糊”效果,”中间点”失去细节。

img

显然,计算平均值时,取值范围越大,”模糊效果”越强烈。

img

上面分别是原图、模糊半径3像素、模糊半径10像素的效果。模糊半径越大,图像就越模糊。从数值角度看,就是数值越平滑。

接下来的问题就是,既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?

如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。

二、正态分布的权重

正态分布显然是一种可取的权重分配模式。

img

在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。

计算平均值的时候,我们只需要将”中心点”作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

第六张图是拉普拉斯算子,最后一张图是Canny算子,原理建议百度百科,

概述一下

使用Sobel算子边检测器时,边缘检测并不那么理想,拉普拉斯边检测器弥补了Sobel检测器的不足,但是拉普拉斯便检测器的输出仍带有很多的噪音,它可以检测两个方向上的边,Canny边检测器在解决噪声方面优于拉普拉斯边检测器和Sobel边检测器·,Canny边检测器是一个分阶段的处理过程,他用到了迟滞性来做边数据处理,还使用了 非极大值抑制。 这一步排除非边缘像素, 仅仅保留了一些细线条(候选边缘) 。

Canny边缘检测算子是John F.Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory ofedge detection),解释了这项技术是如何工作的。Canny边缘检测算法以Canny的名字命名,被很多人推崇为当今最优的边缘检测的算法。

源码附上:

import cv2
import PIL


img = cv2.imread('lena.jpg')
gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
gray = cv2.resize(gray, (400, 430))
img = cv2.resize(img, (400, 430))
sober_horizontal = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=1)
sober_vertical = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
canny = cv2.Canny(img, 50, 240)
img_GanssianBlur = cv2.GaussianBlur(img, (3, 3), 0)
cv2.imshow('original', img)
cv2.imshow('Gray', gray)
cv2.imshow('sobel horizontal', sober_horizontal)
cv2.imshow('sobel vertical', sober_vertical)
cv2.imshow('Laplacation', laplacian)
cv2.imshow('Canny',canny)
cv2.imshow('GaussianBlur', img_GanssianBlur)
cv2.waitKey()

二:直方图均衡化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eW81zpGr-1590071543589)(D:\CSDN\pic\医学影像处理(二)\1590056895614.png)]

img = 'lena.jpg'
img = cv2.imread(img)
img = cv2.resize(img, (400, 430))
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', img_gray)


histeq = cv2.equalizeHist(img_gray)
cv2.imshow('histeq', histeq)

yuv = cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
yuv[:, :, 0] = cv2.equalizeHist(yuv[:, :, 0])

img_histeq = cv2.cvtColor(yuv,cv2.COLOR_YUV2BGR)
cv2.imshow('input', img)
cv2.imshow('histeqs', img_histeq)
cv2.waitKey()

解释一下;

图像的空域处理是一种重要的图像处理技术,这类方法直接以图像的像素操作为基础,主要分为灰度变换空域滤波两大类,直方图均衡化(Histogram equalization)就是一种常用的灰度变换方法。

直方图

对于灰度级(intensity levels)范围为[0,L−1]

[0,L−1]的数字图像,其直方图可以表示为一个离散函数h(rk)=nkr**k是第k级灰度值(intensity value),nkr**k的像素个数,也就是说,。在实际应用中,通常对直方图进行归一化再进行后续处理,假设灰度图像的维数是M×N,MN表示图像的像素总数,则归一化直方图可以表示为p(r**k)=n**k/M**Nk=0,1,…,L−1也就是说,p(rk)表示灰度级*r**k*

对于灰度级(intensity levels)范围为[0,L−1]的数字图像,其直方图可以表示为一个离散函数h(rk)=nkr**k是第k级灰度值(intensity value),nkr**k的像素个数,也就是说,。在实际应用中,通常对直方图进行归一化再进行后续处理,假设灰度图像的维数是M×N,MN表示图像的像素总数,则归一化直方图可以表示为p(r**k)=n**k/M**Nk=0,1,…,L−1也就是说,*p(rk)表示灰度级*r*k*

直方图均衡化

1. 问题描述

通常,暗图像直方图的分量集中在灰度较低的一端,而亮图像直方图分量偏向于灰度较高的一端,如下图
图1 4种基本的图像类型:暗图像、亮图像、低对比度图像、高对比度图像及其对应的直方图
从图中可以得到这样的结论:如果一幅图像的灰度直方图几乎覆盖了整个灰度的取值范围,并且除了个别灰度值的个数较为突出,整个灰度值分布近似于均匀分布,那么这幅图像就具有较大的灰度动态范围和较高的对比度,同时图像的细节更为丰富。已经证明,仅仅依靠输入图像的直方图信息,就可以得到一个变换函数,利用该变换函数可以将输入图像达到上述效果,该过程就是直方图均衡化

三、棱角检测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSm1umvi-1590071543591)(D:\CSDN\pic\医学影像处理(二)\1590063366521.png)]

input_file = 'box.png'
img = cv2.imread(input_file)
cv2.imshow('Input image', img)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = np.float32(img_gray)

img_harris = cv2.cornerHarris(img_gray, 7, 5, 0.04)
img_harris = cv2.dilate(img_harris, None)
img[img_harris > 0.01 * img_harris.max()] = [0, 0, 0]
cv2.imshow('Harris Corners', img)
cv2.waitKey()

基于哈里斯角检测器,基本用法就是:先加载图片,转换为灰度图,然后强制类型转换为浮点值,是为了方便棱角检测,使用cv2.dilate进行膨胀放大操作,便于进行标记棱角,然后进行阈值分割,根据阈值确定棱角判断程度,这个跑跑代码就明白了

Harris角点检测器
1.对图像进行高斯滤波。

2.对每个像素,估计其垂直方向的梯度大小值。使用近似于导数的核做两次一维卷积即可。

3.对每一像素核给定的邻域窗口:

  • 计算局部结构矩阵A
  • 计算响应函数R(A)

4.选取响应函数R(A)的一个阈值,以选择最佳候选角点,并完成非最大化抑制。

Harris角点检测算子是于1988年由CHris Harris & Mike Stephens提出来的。在具体展开之前,不得不提一下Moravec早在1981就提出来的Moravec角点检测算子。

其中还有使用Forstner和Moravec角点检测算子的,这两个比较古老了,大家可以谷歌一下。


四:检测SIFT特征点

尺度不变特征变换SIFT 是计算机视觉中最常用的特征之一,SIFT成为图像识别与图像内容分析领域最有效的特征之一,他在大小,对比度,等方向都有较强的鲁棒性,SIFT也是目标识别系统的基础。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrpVuFty-1590071543594)(D:\CSDN\pic\医学影像处理(二)\1590068077101.png)]

input_file = 'box.png'
img = cv2.imread(input_file)
cv2.imshow('Input image', img)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = np.float32(img_gray)

img_harris = cv2.(img_gray, 7, 5, 0.04)
cv2.imshow('Harris Cornersess', img_harris)

img_harris = cv2.dilate(img_harris, None)
img[img_harris > 0.01 * img_harris.max()] = [0, 0, 0]
cv2.imshow('Harris Corners', img)
cv2.imshow('Harris Cornerses', img_harris)

cv2.waitKey()

上图实现的是使用SIFT提取图像突出的关键点,思想策略比较简单,无非是跟前面的棱角检测一样的思想,不过SIFT不仅仅是做关键点的检测的,他用的更深的是特征的提取器!

SIFT在1999年提出,在2004年加以完善 。SIFT在数字图像的特征描述方面当之无愧可称之为最红最火的一种,许多人对SIFT进行了改进,诞生了SIFT的一系列变种。SIFT已经申请了专利。

SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT算法具有如下一些特点:

1.SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

  1. 区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

  2. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

  3. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

  4. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

SIFT特征检测主要包括以下4个基本步骤:

  1. 尺度空间极值检测:

    搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

  2. 关键点定位

在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

  1. 方向确定

基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

  1. 关键点描述

在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

SIFT特征匹配主要包括2个阶段:

第一阶段:SIFT特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量。

第二阶段:SIFT特征向量的匹配。

SIFT特征的生成一般包括以下几个步骤:

1. 构建尺度空间,检测极值点,获得尺度不变性。

图1 粗检特征点

图1 粗检特征点

  1. 特征点过滤并进行精确定位。

img

  1. 为特征点分配方向值。

img

  1. 生成特征描述子。

以特征点为中心取16×16的邻域作为采样窗口,将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,最后获得4×4×8的128维特征描述子。示意图如下:

img

当两幅图像的SIFT特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果最近距离除以次近距离小于某个阈值,则判定为一对匹配点。

SIFT特征匹配的例子:

[ img

SIFT算法流程图演示:
![](https://img-blog.csdnimg.c

另外SIFT十分常用,我后续还会继续介绍,这边原理和拓展知识比较多,本篇可能写不下,大家关注一下,以后继续!

前面的代码源码合集:(图片自己改就行)

import cv2
import PIL
import numpy as np
# 边检测器
img = cv2.imread('lena.jpg')
gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
gray = cv2.resize(gray, (400, 430))
img = cv2.resize(img, (400, 430))
sober_horizontal = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=1)
sober_vertical = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
canny = cv2.Canny(img, 50, 240)
img_GanssianBlur = cv2.GaussianBlur(img, (3, 3), 0)
# cv2.imshow('original', img)
# cv2.imshow('Gray', gray)
# cv2.imshow('sobel horizontal', sober_horizontal)
# cv2.imshow('sobel vertical', sober_vertical)
# cv2.imshow('Laplacation', laplacian)
# cv2.imshow('Canny',canny)
# cv2.imshow('GaussianBlur', img_GanssianBlur)
# cv2.waitKey()


# 直方图均衡化
img = 'lena.jpg'
img = cv2.imread(img)
img = cv2.resize(img, (400, 430))
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray', img_gray)


histeq = cv2.equalizeHist(img_gray)
# cv2.imshow('histeq', histeq)

yuv = cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
yuv[:, :, 0] = cv2.equalizeHist(yuv[:, :, 0])

img_histeq = cv2.cvtColor(yuv,cv2.COLOR_YUV2BGR)
# cv2.imshow('input', img)
# cv2.imshow('histeqs', img_histeq)
# cv2.waitKey()

input_file = 'box.png'
img = cv2.imread(input_file)
# cv2.imshow('Input image', img)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = np.float32(img_gray)

img_harris = cv2.cornerHarris(img_gray, 7, 5, 0.04)
img_harris = cv2.dilate(img_harris, None)
img[img_harris > 0.01 * img_harris.max()] = [0, 0, 0]
# cv2.imshow('Harris Corners', img)
cv2.waitKey()


input_file = 'table.jpg'
img = cv2.imread(input_file)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
keypoints = sift.detect(img_gray, None)

img_sift = np.copy(img)
cv2.drawKeypoints(img, keypoints, img_sift, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow('Input image', img)
cv2.imshow('SIFT features', img_sift)
cv2.waitKey()

五:Star特征检测

上面说了SIFT,现在介绍一下Star,SIFT特征检测器在很多场景下都很好用,不过,在创建目标识别系统时,在用SIFT特征检测之前,往往需要用到一个不同的特征检测器,就是为了通过灵活地堆叠不同地模块来获得最佳的性能,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRm62UO4-1590071543607)(D:\CSDN\pic\医学影像处理(二)\1590071005354.png)]

import cv2


class StarFeatureDetector(object):
    def __init__(self):
        self.detector = cv2.xfeatures2d.StarDetector_create()

    def detect(self, img):
        return self.detector.detect(img)

if __name__=='__main__':
    input_file = 'table.jpg'
    input_img = cv2.imread(input_file)
    img_gray = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('SAN', input_img)
    keypoints = StarFeatureDetector().detect(input_img)
    cv2.drawKeypoints(input_img, keypoints, input_img,
            flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    cv2.imshow('Star features', input_img)

    cv2.waitKey()

Star特征,也被称为中心环绕极值(或CenSurE)功能,试图解决提供哈尔角点或FAST特征的局部化水平的问题,同时还提供尺度不变性。

今天暂时提供这么多吧,都是一些比较基础的,大佬们不要喷,这是我二刷了,想着记个笔记,最近比较忙,手头有很多事情,这篇也写了很久,大家一起加油吧!最后的最后:深度学习交流群,大佬交流~

上海第二工业大学 智能科学与技术大二

周小夏(CV调包侠)

猜你喜欢

转载自blog.csdn.net/qq_46098574/article/details/106269197