入门:使用 OpenCV 进行图像处理

图像处理是计算机视觉的一个分支,它使用各种算法来处理和分析数字图像。它涉及使用数学或统计操作来为许多应用修改图像,包括但不限于医学和卫星图像以及数字摄影。本文探讨了图像处理的基础知识和该领域中使用的一些技术。

图像处理基础

数字图像由像素组成,像素是代表图像中该点的颜色和亮度值的小方框。图像处理涉及以所需方式处理这些像素,以实现图像所需的效果。大多数对数字图像执行的常见操作包括过滤、增强、恢复等。

过滤是从图像中消除不需要的噪声的过程。这是通过应用调整图像像素值的过滤器来完成的。根据过滤器的类型,它们可用于广泛的应用。它们可以设计用于去除特定类型的噪声,例如高斯噪声、椒盐噪声或斑点噪声。有助于去除上述噪声的滤波器包括中值滤波器、均值滤波器和高斯滤波器。

图片

增强是一种可以提高图像质量的过程。这是通过修改图像的亮度或对比度来完成的。这些技术可能很简单,例如使用直方图调整亮度和对比度,也可能更复杂,例如使用算法来增强图像中的边缘和纹理。

图片

恢复是恢复图像的过程,一些噪声或其他伪影可能会降低图像质量。这些技术涉及使用数学方法从损坏的版本估计原始图像。它是使用反卷积(用于从模糊版本中获取原始图像)或去噪(用于从图像中去除噪声)等技术完成的。

图片

图像预处理对于提高图像质量非常有用,从而有助于分析和进一步处理。一些强大的图像预处理技术包括降噪、对比度增强、图像大小调整、色彩校正、分割、特征提取等。它是图像分析中必不可少的步骤,有助于增强图像中的数据并减少混乱。

随着技术的不断进步,图像处理在我们的日常生活中变得越来越重要。

图像处理的应用

在处理图像数据时,图像预处理是一个关键步骤。当按照所涉及的应用程序进行图像预处理时,可以获得最佳结果。它用于各种领域:

  • 医学成像,提高医学图像质量,更容易发现疾病或异常
  • 图像中的对象识别,例如识别监控视频中的人脸或车牌
  • 对象检测,即主要用于自动驾驶汽车,以更好地在道路上行驶并避免事故
  • 卫星图像使用图像处理来提高天气预报、地图等的图像质量

图像预处理技术

技术的选择取决于图像的性质和应用。以下是一些提高图像质量和适用性的技巧:

  • 降噪:图像中的噪声可能由多种因素引起,例如低光、传感器噪声和压缩伪影。降噪技术旨在去除图像中的噪声,同时保留其基本特征。一些常见的降噪技术包括高斯平滑、中值滤波和小波去噪。
  • 对比度增强:对比度增强技术旨在增加图像的对比度,从而更容易区分不同的图像特征。这些技术可用于医学成像和监视等应用。一些标准的对比度增强技术包括直方图均衡化、自适应直方图均衡化和对比度拉伸。
  • 图像大小调整:图像大小调整技术用于调整图像的大小。可以调整大小以使图像变小或变大或更改其纵横比。一些典型的图像大小调整技术包括最近邻插值法、双线性插值法和双三次插值法。
  • 色彩校正:色彩校正技术用于调整图像的色彩平衡。色彩校正在摄影等应用中很重要,在这些应用中图像的色彩准确性至关重要。一些常见的颜色校正技术包括灰色世界假设、白平衡和颜色转移。
  • 分割:分割技术用于根据图像的内容将图像分成多个区域。分割在医学成像等应用中很有帮助,在这些应用中,特定的结构或器官必须从图像中分离出来。一些标准的分割技术包括阈值化、边缘检测和区域生长算法。
  • 特征提取:特征提取技术用于从图像中识别和提取相关特征。这些特征可用于对象识别和图像分类应用。一些标准的特征提取技术包括边缘检测、角点检测和纹理分析。

应用一些技巧

这里有一些图像处理技术,涉及灰度化、阈值化、使用中值和高斯滤波器进行降噪、阈值化前后的直方图可视化,以及应用于样本图像的canny 边缘检测。

# Sample downloaded image
import cv2
import matplotlib.pyplot as plt

pic1 = plt.imread('download.jpg')
plt.imshow(pic1)
图片
#Converting the sample image to grayscale

img = cv2.cvtColor(pic1, cv2.COLOR_BGR2GRAY)
plt.imshow(img,cmap='gray')
图片

阈值处理:二进制阈值输出仅包含黑色和白色两种颜色。它将所有大于阈值的值映射到白色,小于阈值的值映射到黑色。

#Thresholding: try playing with the threshold value (144 here) to see the changes

ret, thresh1 = cv2.threshold(img, 140, 255, cv2.THRESH_BINARY)
plt.imshow(thresh1,cmap='gray')
图片

降噪:通常根据噪声的性质进行过滤。在这里,由于我们不知道可能存在的噪声的性质,我们尝试应用中值和高斯滤波器。

#Median filter

img = cv2.cvtColor(pic1, cv2.COLOR_BGR2GRAY)
median = cv2.medianBlur(img,5)
plt.figure(figsize=(16, 16))
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Noisy Image')
plt.subplot(122),
plt.imshow(median,cmap = 'gray')
plt.title('Median filter')
plt.show()
图片
gaussian_blur1 = cv2.GaussianBlur(img,(5,5),2,cv2.BORDER_DEFAULT)
gaussian_blur2 = cv2.GaussianBlur(img,(5,5),7,cv2.BORDER_DEFAULT)

plt.figure(figsize=(20, 20))
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Noisy Image')

plt.subplot(1,3,2),
plt.imshow(gaussian_blur1,cmap = 'gray')
plt.title('smoothing with Gaussian sigma=2')

plt.subplot(1,3,3),
plt.imshow(gaussian_blur2,cmap = 'gray')
plt.title('smoothing with Gaussian sigma=7')
图片

Otsu阈值:在这里,我们不指定将值映射到黑色和白色的阈值。Otsu算法使用直方图来估计什么阈值最适合给定图像,因此更有用。

#Otsu's thresholding before and after Gaussian filtering
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.imshow(th2,cmap='gray')
plt.imshow(th3,cmap='gray')
图片
图片

直方图是每个图像强度值的像素数的直观表示。对原始图像和过滤后的图像应用阈值处理前后直方图的变化如下所示。

plt.figure(figsize=(16,16))
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
          img, 0, th2,
          blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
          'Original Noisy Image','Histogram',"Otsu's Thresholding",
          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()
图片

Canny 边缘检测:它建立在 Sobel 过滤器之上,本质上是在计算图像每个像素的图像强度梯度时起作用的,因为在图像边缘中,当颜色快速变化时梯度最大。

#Hough Line Transform
dst = cv2.Canny(img, 50, 200, None, 3)
lines = cv2.HoughLines(dst, 1, np.pi / 180, 150, None, 0, 0)
# Draw the lines
if lines is not None:
    for i in range(0, len(lines)):
        rho = lines[i][0][0]
        theta = lines[i][0][1]
        a = math.cos(theta)
        b = math.sin(theta)
        x0 = a * rho
        y0 = b * rho
        pt1 = (int(x0 + 1000*(-b)), int(y0 + 1000*(a)))
        pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))
        cv2.line(cdst, pt1, pt2, (0,0,255), 3, cv2.LINE_AA)
cdst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR)
plt.imshow(cdst)
图片

结论

本文将指导你完成图像处理的前几个步骤。它总结了图像处理中使用的一些应用程序。它旨在使你熟悉该领域中使用的一些技术及其应用。

本文要点:

  • 图像处理是提高图像质量的重要步骤。
  • 广泛的应用包括医疗、卫星、对象检测和识别。
  • 过滤器可以帮助去除图像中的噪声
  • 图像的梯度有助于检测图像中的边缘

作者:磐怼怼 | 来源:公众号——深度学习与计算机视觉

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论