OpenCV中有数百种在不同色彩空间之间转换的方法。如今,在计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV(Hue, Saturation,Value)。
- 灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测。
- BGR,即蓝-绿-红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。
- HSV,H(Hue)是色调, S(Saturation)是饱和度, V(Value)表示黑暗的程度(或光谱另一端的明亮程度)。
傅里叶变换
在OpenCV中,对图像和视频的处理大多数都会涉及到傅里叶变换的概念。具体而言,就是我们所观察到所有的波形都可以由一系列简单且频率不同的正弦曲线叠加得到。也就是说所看到的波形都是由不同的正弦曲线叠加得到的。在图像处理上就可以理解为原始图像由许多频率组成,我们就能够分离这些频率来理解图像和提取感兴趣的数据。
让·巴普蒂斯·约瑟夫·傅里叶
让·巴普蒂斯·约瑟夫·傅里叶(Baron Jean Baptiste Joseph Fourier,1768-1830),男爵,法国数学家、物理学家,1768年3月21日生于欧塞尔,1830年5月16日卒于巴黎。1817年当选为科学院院士,1822年任该院终身秘书,后又任法兰西学院终身秘书和理工科大学校务委员会主席。
主要贡献是在研究《热的传播》和《热的分析理论》时创立了一套数学理论,对19世纪的数学和物理学的发展都产生了深远影响。
图像的幅度谱(magintude spectrum)。幅度谱图像呈现了原始图像在变化方面的一种表示:把一幅图像中最明亮的像素放到图像中央,然后逐渐变暗,在边缘上的像素最暗。这样可以发现图像中有多少亮的像素和暗的像素,以及它们的百分比。
高通滤波器(HPF, High Pass Filter)
高通滤波器(HPF)是检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升该像素的亮度的滤波器。也就是说,如果一个像素比它周围的像素更突出,就会提升它的亮度。
低通滤波器(Low Pass Filter)
高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。低通滤波器则是在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度。主要用于去噪和模糊化,如高斯模糊是最常用的模糊滤波器,是一个削弱高频信号强度的低通滤波器。
import numpy as np
import pandas as pd
import cv2
from scipy import ndimage
#滤波器矩阵
kernel_3x3 = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
kernel_5x5 = np.array([[-1, -1, -1, -1, -1],
[-1, 1, 2, 1, -1],
[-1, 2, 4, 2, -1],
[-1, 1, 2, 1, -1],
[-1, -1, -1, -1, -1]])
img = cv2.imread("img800.jpg", 0)
k3 = ndimage.convolve(img, kernel_3x3)
k5 = ndimage.convolve(img, kernel_5x5)
#高斯模糊滤波
blurred = cv2.GaussianBlur(img, (17,17), 0)
g_hpf = img - blurred
# cv2.imshow('blurred', blurred)
# cv2.imshow("g_hpf", g_hpf)
cv2.imshow("img", img)
cv2.imshow("3x3", k3)
cv2.imshow("5x5", k5)
cv2.imshow("g_hpf", g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()
边缘检测
边缘在人类视觉和计算机视觉中起着重要作用。OpenCV提供了许多边缘检测滤波函数,如Laplacian(), Sobel()以及Scharr()。这些滤滤函数会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和的颜色。但它们又很容易将噪声错误地识别为边缘。解决方案就是在找到边缘之前对图像进行模糊处理。OpenCV提供的模糊滤波函数,如blur(),medianBlur()以及GaussianBlur()。
Canny边缘检测
Canny边缘检测步骤:使用高斯滤波器对图像进行去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双(double)阈值去除假阳性,最后分析所有的边缘及其之间的连接,以保留真正的边缘并消除不明显的边缘。
import numpy as np
import pandas as pd
import cv2
img = cv2.imread("img800.jpg", 0)
cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))
cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()