【机器学习】OpenCV高级图像处理
🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"
文章目录
- OpenCV高级图像处理
- 图像滤波
- 线性滤波
- 高斯滤波
- 均值滤波
- 双边滤波
- 非线性滤波
- 中值滤波
- 图像金字塔
- 高斯金字塔
- 拉普拉斯金字塔
- 图像分割
- 阈值分割
- 边缘检测
- 轮廓处理
- 分水岭算法
- 特征检测与描述
- Harris角点检测
- SIFT特征检测与描述
- SURF特征检测与描述
- 图像变换
- 傅里叶变换
- 霍夫变换
- 距离变换
- 图像修复与增强
- 去噪
- 去雾
OpenCV高级图像处理
在掌握了OpenCV的基础知识之后,我们将深入探讨OpenCV在高级图像处理领域的应用。本文将介绍一些常用的高级图像处理技术,包括图像滤波、图像金字塔、图像分割、特征检测与描述、图像变换以及图像修复与增强。
图像滤波
图像滤波是图像处理中的一个基本操作,用于减少噪声、锐化边缘或提取特征。OpenCV提供了多种滤波算法,包括线性滤波和非线性滤波。
线性滤波
线性滤波是通过卷积操作实现的,其中卷积核定义了滤波器的性质。常用的线性滤波包括高斯滤波、均值滤波和双边滤波等。
高斯滤波
高斯滤波是一种常用的线性滤波方法,它使用高斯核对图像进行平滑。高斯核的权重由高斯函数决定,中心点的权重最大,远离中心点的权重逐渐减小。
G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e−2σ2x2+y2
其中, ( x , y ) (x, y) (x,y)是像素坐标,而 σ \sigma σ是高斯核的标准差,决定了滤波的强度。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.GaussianBlur(img, (5, 5), 0)
均值滤波
均值滤波是一种简单的线性滤波方法,它用邻域内所有像素的平均值替换中心像素的值。这种方法可以有效消除高斯噪声,但会导致边缘模糊。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.blur(img, (5, 5))
双边滤波
双边滤波是一种边缘保留滤波,它不仅考虑像素之间的空间距离,还考虑像素值之间的相似性。这使得它能够有效平滑图像同时保留边缘细节。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.bilateralFilter(img, 9, 75, 75)
非线性滤波
非线性滤波是基于像素值的排序统计运算,而不是线性组合。常用的非线性滤波包括中值滤波、最大值滤波和最小值滤波等。
中值滤波
中值滤波是一种非线性滤波方法,它用邻域内像素值的中值替换中心像素的值。这种方法可以有效消除椒盐噪声,同时保留边缘细节。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.medianBlur(img, 5)
图像金字塔
图像金字塔是一种多尺度表示方法,它通过上采样或下采样生成一系列分辨率不同的图像。OpenCV提供了两种图像金字塔:高斯金字塔和拉普拉斯金字塔。
高斯金字塔
高斯金字塔是通过对原始图像进行连续的高斯平滑和下采样操作生成的。每一层的图像都是上一层图像的缩小版本,分辨率降低一半。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
g_pyr = [img]for i in range(6):img = cv.pyrDown(img)g_pyr.append(img)
拉普拉斯金字塔
拉普拉斯金字塔是通过高斯金字塔的相邻层之间的差值构建的。它保留了原始图像的边缘和细节信息,常用于图像合成和重建。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
g_pyr = [img]
l_pyr = []for i in range(6):img = cv.pyrDown(img)g_pyr.append(img)for i in range(5, -1, -1):l_pyr.append(cv.subtract(g_pyr[i], cv.pyrUp(g_pyr[i+1])))
图像分割
图像分割是将图像划分为多个独立区域的过程,每个区域具有相似的特征,如颜色、纹理或亮度。OpenCV提供了多种图像分割算法,包括阈值分割、边缘检测、轮廓处理和分水岭算法等。
阈值分割
阈值分割是一种简单的分割方法,它根据像素值与预设阈值的比较将图像划分为前景和背景。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
边缘检测
边缘检测是一种常用的图像分割技术,它通过检测图像中的边缘来分割对象。常用的边缘检测算子包括Sobel、Canny等。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
edges = cv.Canny(img, 100, 200)
轮廓处理
轮廓是一个连续的点集,它描述了物体的形状。OpenCV提供了findContours()
函数用于查找图像中的轮廓,并提供了一系列操作函数,如drawContours()
、contourArea()
等。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
_, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
contours, _ = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(img, contours, -1, (0, 255, 0), 2)
分水岭算法
分水岭算法是一种基于拓扑理论的图像分割方法,它将图像看作一个地形,并根据像素值的高低来模拟水流的流向,从而将图像划分为不同的区域。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
_, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
kernel = np.ones((3, 3), np.uint8)
opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)
sure_bg = cv.dilate(opening, kernel, iterations=3)
dist_transform = cv.distanceTransform(opening, cv.DIST_L2, 5)
_, sure_fg = cv.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
unknown = cv.subtract(sure_bg, sure_fg)
_, markers = cv.connectedComponents(sure_fg)
markers = markers + 1
markers[unknown == 255] = 0
markers = cv.watershed(img, markers)
img[markers == -1] = [255, 0, 0]
特征检测与描述
特征检测和描述是计算机视觉中的一个重要步骤,它用于提取图像中的关键点和描述符,以便进行后续的匹配、跟踪或识别任务。OpenCV提供了多种特征检测和描述算法,包括Harris角点检测、SIFT和SURF等。
Harris角点检测
Harris角点检测是一种基于图像梯度的角点检测算法,它可以检测出图像中的角点和边缘。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
corners = cv.cornerHarris(gray, 2, 3, 0.04)
corners = cv.dilate(corners, None)
img[corners > 0.01 * corners.max()] = [0, 0, 255]
SIFT特征检测与描述
SIFT(Scale-Invariant Feature Transform)是一种常用的特征检测和描述算法,它可以提取图像中的关键点,并为每个关键点计算一个128维的描述符向量,具有尺度不变性和旋转不变性。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
sift = cv.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)
img = cv.drawKeypoints(img, kp, None)
SURF特征检测与描述
SURF(Speeded-Up Robust Features)是另一种常用的特征检测和描述算法,它比SIFT更快,但精度略低。SURF也可以提取关键点和计算描述符,具有一定的尺度不变性和旋转不变性。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
surf = cv.xfeatures2d.SURF_create()
kp, des = surf.detectAndCompute(gray, None)
img = cv.drawKeypoints(img, kp, None)
图像变换
图像变换是指对图像进行几何或频域上的转换,以提取特征或改变图像的表示形式。OpenCV提供了多种图像变换算法,包括傅里叶变换、霍夫变换和距离变换等。
傅里叶变换
傅里叶变换是一种将图像从空间域转换到频域的方法,它可以用于图像滤波、图像重建和图像压缩等应用。OpenCV提供了dft()
和idft()
函数来计算离散傅里叶变换及其逆变换。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
dft = cv.dft(np.float32(img), flags=cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20 * np.log(cv.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
霍夫变换
霍夫变换是一种用于检测图像中直线或圆形等几何形状的技术。它通过在参数空间中寻找累加器的局部最大值来检测这些形状。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3)
lines = cv.HoughLines(edges, 1, np.pi / 180, 200)
for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
距离变换
距离变换是一种计算图像中每个像素到最近的非零像素的距离的方法。它常用于图像分割、骨架提取和形状分析等应用。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
dist_transform = cv.distanceTransform(thresh, cv.DIST_L2, 5)
图像修复与增强
图像修复和增强是指对图像进行处理,以提高图像质量或修复图像缺陷。OpenCV提供了多种图像修复和增强算法,包括去噪、去雾和超分辨率等。
去噪
去噪是指从图像中去除噪声,以提高图像质量。OpenCV提供了多种去噪算法,如高斯滤波、中值滤波和非局部均值滤波等。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
dst = cv.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
去雾
去雾是指从图像中去除由于大气环境造成的雾霾效应,以提高图像的对比度和清晰度。OpenCV提供了基于暗通道先验的去雾算法。
import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
haze_removal = cv.dehaze(img.copy())