(七)图像的各种变换(cvtColor*+)imgproc

1、图像的各种变换(cvtColor*+)imgproc


imgproc是OpenCV一个比较复杂的lib,我是分开介绍的,之前介绍过了滤波器、直方图、结构分析和形状描述三节,这次介绍一下图像的变换,OpenCV对于图像的变换又可分为几何变换和其他的变换,我这节先介绍一下其他的变换。

这部分的函数包括adaptiveThreshold,对图像进行自适应的阈值操作。

相应的也有更一般常用的阈值操作函数threshold。

这里还是详细介绍一下cvtColor,这个函数是用来进行颜色空间的转换,随着OpenCV版本的升级,对于颜色空间种类的支持也是越来越多。这里汇总一下,把我知道的全部空间列举出来,也许还不完整,希望大家补充。需要先告诉大家的是OpenCV默认的图片通道是BGR。

RGB <--> BGR:CV_BGR2BGRA、CV_RGB2BGRA、CV_BGRA2RGBA、CV_BGR2BGRA、CV_BGRA2BGR

RGB <--> 5X5:CV_BGR5652RGBA、CV_BGR2RGB555、(以此类推,不一一列举)

RGB <---> Gray:CV_RGB2GRAY、CV_GRAY2RGB、CV_RGBA2GRAY、CV_GRAY2RGBA

RGB <--> CIE XYZ:CV_BGR2XYZ、CV_RGB2XYZ、CV_XYZ2BGR、CV_XYZ2RGB

RGB <--> YCrCb(YUV) JPEG:CV_RGB2YCrCb、CV_RGB2YCrCb、CV_YCrCb2BGR、CV_YCrCb2RGB、CV_RGB2YUV(将YCrCb用YUV替代都可以)

RGB <--> HSV:CV_BGR2HSV、CV_RGB2HSV、CV_HSV2BGR、CV_HSV2RGB

RGB <--> HLS:CV_BGR2HLS、CV_RGB2HLS、CV_HLS2BGR、CV_HLS2RGB

RGB <--> CIE L*a*b*:CV_BGR2Lab、CV_RGB2Lab、CV_Lab2BGR、CV_Lab2RGB

RGB <--> CIE L*u*v:CV_BGR2Luv、CV_RGB2Luv、CV_Luv2BGR、CV_Luv2RGB

RGB <--> Bayer:CV_BayerBG2BGR、CV_BayerGB2BGR、CV_BayerRG2BGR、CV_BayerGR2BGR、CV_BayerBG2RGB、CV_BayerGB2RGB、 CV_BayerRG2RGB、CV_BayerGR2RGB(在CCD和CMOS上常用的Bayer模式)

YUV420 <--> RGB:CV_YUV420sp2BGR、CV_YUV420sp2RGB、CV_YUV420i2BGR、CV_YUV420i2RGB

还有函数distanceTransform,是用来计算各像素距离最近的零像素距离的。

floodFill函数用来用指定颜色填充一个连通部件。

inpaint函数用来用附近区域信息重建选中区域,可以对图像里由于传输噪声丢失的块进行重建。

integral函数用来获得图像的积分值。
给图像添加水印的函数watershed。


对图像进行GrabCut算法的grabCut函数(有待研究,不熟悉)。

总之,这些变换千奇百怪,不是很系统,常用的还是我先介绍的几个,比如threshold、cvtColor。就这样吧,以后有收获再陆续补充。

2、contrib为最新贡献但不是很成熟的函数库。作为最新的东西,就更有价值进行庖丁解牛了,我来也。


首先介绍一个CvAdaptiveSkinDetector类。该类的功能是自适应的皮肤检测。分析了一下代码,其构造函数的输入参数有两个,samplingDivider样本分类,morphingMethod为变形方法。该类的关键函数为process函数,该函数先将输入图像由RGB转换为HSV空间,Hue的范围是3~33,Intensity(V)的范围为15~250。然后进行必要的腐蚀膨胀,去除噪声,使轮廓更加清晰平滑。具体的使用代码参考sample文件夹中的adaptiveskindetector.cpp


最近也在玩手势识别,资料找了很多,基本可以分为静态手势识别和动态手势识别,先弄个简单的静态手势识别给大家看看。
基本流程如下:

先滤波去噪-->转换到HSV空间-->根据皮肤在HSV空间的分布做出阈值判断,这里用到了inRange函数,然后进行一下形态学的操作,去除噪声干扰,是手的边界更加清晰平滑-->得到的2值图像后用findContours找出手的轮廓,去除伪轮廓后,再用convexHull函数得到凸包络。

结果如下:
源代码下载位置:
http://download.csdn.net/detail/yang_xian521/3746669,有点贵哦,当时随便设了个值,呵呵

OpenCV提供了Hough变换函数`HoughLines`和`HoughLinesP`来实现图像中直线的检测。 其中,`HoughLines`函数可以检测出所有直线,而`HoughLinesP`函数可以检测出直线的端点坐标。 下面是一个简单的Java代码示例,用于实现对图像中直线的检测: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class HoughLines { public static void main(String[] args) { // 加载OpenCV库 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取图像 Mat src = Imgcodecs.imread("input.jpg"); // 转化为灰度图像 Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); // 进行边缘检测 Mat edges = new Mat(); Imgproc.Canny(gray, edges, 50, 150, 3, false); // 进行Hough变换 Mat lines = new Mat(); Imgproc.HoughLines(edges, lines, 1, Math.PI / 180, 150); // 绘制直线 for (int i = 0; i < lines.rows(); i++) { double[] data = lines.get(i, 0); double rho = data[0]; double theta = data[1]; double a = Math.cos(theta); double b = Math.sin(theta); double x0 = a * rho; double y0 = b * rho; Point pt1 = new Point(Math.round(x0 + 1000 * (-b)), Math.round(y0 + 1000 * (a))); Point pt2 = new Point(Math.round(x0 - 1000 * (-b)), Math.round(y0 - 1000 * (a))); Imgproc.line(src, pt1, pt2, new Scalar(0, 0, 255), 3, Imgproc.LINE_AA, 0); } // 显示结果 HighGui.imshow("Hough Lines", src); HighGui.waitKey(); } } ``` 在这个示例中,我们首先使用`Imgproc.cvtColor`函数将图像转化为灰度图像,然后使用`Imgproc.Canny`函数进行边缘检测。接着,我们使用`Imgproc.HoughLines`函数进行Hough变换,得到所有直线的参数。最后,我们使用`Imgproc.line`函数在原图像上绘制直线。 注意:在使用Hough变换前,需要对图像进行边缘检测,因为Hough变换只能检测出边缘上的直线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值