第六章
OpenCV提供了大量的功能来处理不同类型的图像处理任务,如图像滤波、几何变换、绘制、不同颜色空间的处理、图像直方图等等。
6.1图像滤波
本节中所有的函数都是以Mat图像作为输入,并生成具有同样大小和相同通道数的Mat图像。通常滤波算法是从输入图像获取一个像素及其临近的像素,但是图像边缘的像素可能会缺少某个方向的邻近像素,所以作出假设,可能设为0或者与边界像素相等之类,用到cv::BorderTypes枚举指定。
QStringList items;
// 常数边界模式 边界外的像素值被设置为一个特定的常数值
items.append("BORDER_CONSTANT");// 复制边界模式 边界外的像素值是图像边界像素的复制
items.append("BORDER_REPLICATE");// 反射边界模式 边界外的像素值是图像边界像素的反射(对称)
items.append("BORDER_REFLECT");// 环绕边界模式 边界外的像素值从图像的另一边“环绕”过来
items.append("BORDER_WRAP");// 反射边界模式 (特定变种) 图像边界处只使用单个像素进行反射
items.append("BORDER_REFLECT_101");
OpenCV中的滤波函数:
bilateralFilter:可以用来获取图像的双边滤波拷贝
blur、boxFilter、sqrBoxFilter、GaussianBlur和medianblur:获取输入图像的平滑版本
filter2D:该函数是自定义滤波器应用于图像,需要为函数提供核矩阵
//sharpening image
Matx33f f2dkernel(0,-1,0,\n -1,5,-1,\n 0,-1,0);
int depth = -1;
filter2D(inpMat,outMat,depth,f2dkernel);
//Edge detection
Matx33f f2dkernel(0,-1.5,0,\n +1.5,-6,+1.5,\n 0,+1.5,0);
int depth = -1;
filter2D(inpMat,outMat,depth,f2dkernel);
Laplacian、Scharr、Sobel以及spatialGradient:处理图像的导数。
int depth = -1;
int dx = 1;int dy = 1;
int kernelSize = 3;
double scale = 5; double delta = 220;
Sobel(inpMat, outMat, depth, dx, dy, kernelSize, scale, delta);
erode和dilate:腐蚀与膨胀。
morphologyEx:该函数可用于执行各种形态学运算。
MORPH_ERODE: 结果与erode相同
MORPH_DILATE: 结果与dilate相同
MORPH_OPEN: 执行开运算,先腐蚀再膨胀
MORPH_CLOSE: 执行闭运算,先膨胀再腐蚀
MORPH_GRADIENT: 提取图像轮廓,用图像的腐蚀与膨胀图像相减
MORPH_TOPHAT: 原始图像与开运算后的差
MORPH_BLACKHAT: 闭运算后与原始图像的差
6.2图像变换功能
6.2.1 几何变换
resize:用来调整图像大小
warpAffine:执行仿射变换,要提供变换矩阵,getAffineTransform
warpPerspective:实现透视变换
remap:几何变换函数,可以完成图源像素到输出图像的重映射
6.2.2 其他变换
颜色与颜色空间,颜色映射应用,傅里叶变换。
6.2.2.1 颜色与颜色空间
允许使用cvtColor函数在不同的颜色间转换,该函数接受输入和输出图像以及一个变换码,后者是cv::ColorConversionCodes枚举中的一项。
//Convert BGR to HSV color space
cvtColor(inputImage, outputImage, CV_BGR2HSV);
//Convert Grayscale to RBGA color space
cvtColor(inputImage, outputImage, CV_GRAY2RGBA);
还提供applyColorMap函数可以将图像中的颜色映射到输出图像中的其他颜色,也要提供来自cv::ColormapTypes枚举的颜色类型
applyColorMap(inputImage, outputImage, COLORMAP_JET);
6.2.2.2 图像阈值化
图像阈值化是图像分割的方法,而分割本身就是将图像按照强度、颜色或者其他图像属性区分为不同的像素组的过程。
threshold:对图像应用一个固定级别的阈值。
adaptiveThreshold:对灰度图应用自适应值。
6.2.2.3 离散傅里叶变换
图像的DFT可以用来挖掘原始图像中难以察觉的、不可见的信息。首先使用dft函数的得到图像的DFT,以生成含有复数值的频率函数。
傅里叶变换看书看书看书看书看书看书。
6.3 OpenCV绘图
color、thickness(轮廓)、lineType、shift、line、arrowedLine、rectangle、putText。
6.4 模板匹配
使用正确的模板匹配并与良好的阈值相结合的话,可以有效的对图像中的对象进行检测和计数,通过matchTemplate的函数可以实现,可以是以下枚举列表:
TM_SQDIFF; TM_SQDIFF_NORMED; TM_CCORR; TM_CCORR_NORMED;
TM_CCOEFF; TM_CCOEFF_NORMED
matchTemplate函数用大小为W*H的模板在大小为Q*S的图像上滑动,并使用在method参数中指定的方法,将模板与图像的所有重叠部分进行比较,然后将比较结果存储在结果Mat(result Mat)中。