应聘网站建设工程师,eroticalia wordpress,做盗版视频网站吗,wordpress电影网盘OpenCV实战——基于分水岭算法的图像分割0. 前言1. 分水岭算法2. 分水岭算法直观理解3. 完整代码相关链接0. 前言
分水岭变换是一种流行的图像处理算法#xff0c;用于快速将图像分割成同质区域。分水岭变换主要基于以下思想#xff1a;当图像被视为拓扑浮雕时#xff0c;均…
OpenCV实战——基于分水岭算法的图像分割0. 前言1. 分水岭算法2. 分水岭算法直观理解3. 完整代码相关链接0. 前言
分水岭变换是一种流行的图像处理算法用于快速将图像分割成同质区域。分水岭变换主要基于以下思想当图像被视为拓扑浮雕时均质区域对应于相对平坦且由陡峭的边缘界定的盆地。算法的原始版本倾向于过度分割图像从而产生多个小区域因此 OpenCV 中实现了该算法的改进版本通过使用一组预定义的标记来指导图像分割区域的定义。
1. 分水岭算法
分水岭分割可以通过使用 cv::watershed 函数实现函数的输入是一个 32 位有符号整数标记图像其中每个非零像素表示一个标签。 通过标记图像中已知属于给定区域的一些像素利用初始标记分水岭算法可以确定其他像素所属的区域。
(1) 首先将标记图像读取为灰度图像然后将其转换为整数类型
class WatershedSegmentater {private:cv::Mat markers;public:void setMarkers(const cv::Mat markerImage) {// 转换数据类型markerImage.convertTo(markers, CV_32S);}cv::Mat process(const cv::Mat image) {// 应用分水岭算法cv::watershed(image, markers);return markers;}有多种获取标记的方式例如使用预处理步骤识别出属于感兴趣对象的某些像素然后利用分水岭算法根据初始标记分割完整的对象。在本节中我们将使用二值图像来识别相应原始图像中的动物。因此从二值图像中我们需要识别属于前景(动物)的像素和属于背景(主要是雪地)的像素我们用标签 255 标记前景像素用标签 128 标记背景像素其他像素则标记为 0。
(2) 初始二值图像包含过多属于图像各个部分的白色像素为了只保留属于重要对象的像素我们首先需要腐蚀该图像
// 消除噪音
cv::Mat fg;
cv::erode(binary, fg, cv::Mat(), cv::Point(-1, -1), 4);结果如下图所示 (3) 图中仍然存在一些属于背景(雪地)的像素我们通过对原始二值图像进行膨胀来选择几个属于背景的像素
// 标记图像像素
cv::Mat bg;
cv::dilate(binary, bg, cv::Mat(), cv::Point(-1, -1), 4);
cv::threshold(bg, bg, 1, 128, cv::THRESH_BINARY_INV);结果如下图所示黑色像素对应于背景像素 (4) 将这些图像组合起来形成标记图像
cv::Mat markers(binary.size(), CV_8U, cv::Scalar(0));
markers fgbg;我们使用重载的 运算符来组合图像得到用作分水岭算法的输入 (5) 在这个输入图像中白色区域属于前景对象灰色区域是背景的一部分黑色区域则属于未知标签得到分割结果如下
// 创建分水岭分割对象
WatershedSegmentater segmenter;
segmenter.setMarkers(markers);
segmenter.process(image);更新标记图像以便为黑色区域中的像素重新分配标签而属于边界的像素的值为 -1。结果标签图像如下 图像中对象边缘的可视化结果如下图所示 2. 分水岭算法直观理解
我们使用拓扑图进行类比为了创建分水岭分割我们从级别 0 开始注水随着水位逐渐增加就形成了集水盆地。这些盆地的大小也会逐渐增加两个不同盆地的水最终会汇合发生这种情况时会创建一个分水岭以将两个盆地分开。一旦水位达到最高水位这些水域和分水岭就形成了分水岭分割。 在注水过程中最初会产生许多小盆地当这些盆地进行合并时会创建许多分水岭线从而导致图像被过度分割。为了克服这个问题已经提出了多种改进算法在 OpenCV 调用 cv::watershed 函数时注水过程从一组预定义的标记像素开始根据分配给初始标记的值对盆地进行标记当具有相同标签的两个盆地合并时不会创建分水岭从而防止过度分割更新输入标记图像以获得最终的分水岭分割。用户可以输入带有任意数量的标签和未知标签的标记图像标记图像的像素类型为为 32 位有符号整数以便能够定义超过 255 个标签。cv::watershed 函数还允许返回与分水岭关联的像素(使用特殊值 -1 进行标记)。 为了便于显示结果我们引入两种特殊的方法。第一个方法 getSegmentation() 通过阈值返回标签图像分水岭值为 0
// 返回结果
cv::Mat getSegmentation() {cv::Mat tmp;markers.convertTo(tmp, CV_8U);return tmp;
}第二种方法 getWatersheds() 返回的图像中分水岭线使用值 0 进行标记图像的其余部分像素值为 255可以使用 cv::convertTo 方法实现
// 返回分水岭
cv::Mat getWatersheds() {cv::Mat tmp;markers.convertTo(tmp,CV_8U,255,255);return tmp;
}在转换之前应用线性变换可以将像素值 -1 转换为 0 (−1×2552550-1\times 2552550−1×2552550)。由于将有符号整数转换为无符号字符时需应用饱和操作大于 255 的像素值将转换为 255。 我们也可以通过许多不同的方式获得标记图像。例如可以令用户以交互方式在图像中标记属于对象和背景的像素区域或者如果我们需要识别位于图像中心的物体可以输入一个中心区域标有特定标签的图像且图像背景标记带有另一个标签可以按以下方式创建标记图像
// 标记背景像素
cv::Mat imageMask(image.size(), CV_8U, cv::Scalar(0));
cv::rectangle(imageMask,cv::Point(5, 5),cv::Point(image.cols-5, image.rows-5),cv::Scalar(255),3);
// 标记前景像素
cv::rectangle(imageMask,cv::Point(image.cols/2-10, image.rows/2-10),cv::Point(image.cols/210, image.rows/210),cv::Scalar(1),10);如果我们将此标记图像叠加在测试图像上可以得到以下图像 生成的分水岭图像如下图所示 3. 完整代码
头文件 (watershedSegmentation.h) 完整代码如下
#if !defined WATERSHS
#define WATERSHS#include opencv2/core/core.hpp
#include opencv2/imgproc/imgproc.hppclass WatershedSegmentater {private:cv::Mat markers;public:void setMarkers(const cv::Mat markerImage) {// 转换数据类型markerImage.convertTo(markers, CV_32S);}cv::Mat process(const cv::Mat image) {// 应用分水岭算法cv::watershed(image, markers);return markers;}// 返回结果cv::Mat getSegmentation() {cv::Mat tmp;markers.convertTo(tmp, CV_8U);return tmp;}// 返回分水岭cv::Mat getWatersheds() {cv::Mat tmp;markers.convertTo(tmp,CV_8U,255,255);return tmp;}
};#endif主文件 (segment.cpp) 完整代码如下所示
#include iostream
#include opencv2/core/core.hpp
#include opencv2/highgui/highgui.hpp
#include opencv2/imgproc/imgproc.hpp
#include watershedSegmentation.hint main() {// 读取输入图像cv::Mat image cv::imread(1.png);if (!image.data) return 0;cv::namedWindow(Original Image);cv::imshow(Original Image,image);// 读取二值图像cv::Mat binary;binary cv::imread(binary.png, 0);cv::namedWindow(Binary Image);cv::imshow(Binary Image, binary);// 消除噪音cv::Mat fg;cv::erode(binary, fg, cv::Mat(), cv::Point(-1, -1), 4);cv::namedWindow(Foreground Image);cv::imshow(Foreground Image, fg);// 标记图像像素cv::Mat bg;cv::dilate(binary, bg, cv::Mat(), cv::Point(-1, -1), 4);cv::threshold(bg, bg, 1, 128, cv::THRESH_BINARY_INV);cv::namedWindow(Background Image);cv::imshow(Background Image, bg);cv::Mat markers(binary.size(), CV_8U, cv::Scalar(0));markers fgbg;cv::namedWindow(Markers);cv::imshow(Markers, markers);// 创建分水岭分割对象WatershedSegmentater segmenter;segmenter.setMarkers(markers);segmenter.process(image);cv::namedWindow(Segmentation);cv::imshow(Segmentation, segmenter.getSegmentation());cv::namedWindow(Watersheds);cv::imshow(Watersheds, segmenter.getWatersheds());// 打开另一张图像image cv::imread(3.png);// 标记背景像素cv::Mat imageMask(image.size(), CV_8U, cv::Scalar(0));cv::rectangle(imageMask,cv::Point(5, 5),cv::Point(image.cols-5, image.rows-5),cv::Scalar(255),3);// 标记前景像素cv::rectangle(imageMask,cv::Point(image.cols/2-10, image.rows/2-10),cv::Point(image.cols/210, image.rows/210),cv::Scalar(1),10);segmenter.setMarkers(imageMask);segmenter.process(image);cv::rectangle(image,cv::Point(5, 5),cv::Point(image.cols-5, image.rows-5),cv::Scalar(255, 255, 255),3);cv::rectangle(image,cv::Point(image.cols/2-10, image.rows/2-10),cv::Point(image.cols/210, image.rows/210),cv::Scalar(1, 1, 1),10);cv::namedWindow(Image with marker);cv::imshow(Image with marker, image);cv::namedWindow(Watershed);cv::imshow(Watershed, segmenter.getWatersheds());cv::waitKey();return 0;
}相关链接
OpenCV实战1——OpenCV与图像处理基础 OpenCV实战2——OpenCV核心数据结构 OpenCV实战3——图像感兴趣区域 OpenCV实战4——像素操作 OpenCV实战5——图像运算详解 OpenCV实战6——OpenCV策略设计模式 OpenCV实战7——OpenCV色彩空间转换 OpenCV实战8——直方图详解 OpenCV实战9——基于反向投影直方图检测图像内容 OpenCV实战10——积分图像详解 OpenCV实战11——形态学变换详解 文章转载自: http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn http://www.morning.nfpct.cn.gov.cn.nfpct.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.jfgmx.cn.gov.cn.jfgmx.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.zjcmr.cn.gov.cn.zjcmr.cn http://www.morning.qdrrh.cn.gov.cn.qdrrh.cn http://www.morning.snbry.cn.gov.cn.snbry.cn http://www.morning.pfnwt.cn.gov.cn.pfnwt.cn http://www.morning.bmrqz.cn.gov.cn.bmrqz.cn http://www.morning.yllym.cn.gov.cn.yllym.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.mlyq.cn.gov.cn.mlyq.cn http://www.morning.txhls.cn.gov.cn.txhls.cn http://www.morning.smdkk.cn.gov.cn.smdkk.cn http://www.morning.qtkdn.cn.gov.cn.qtkdn.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.xnqjs.cn.gov.cn.xnqjs.cn http://www.morning.nnhrp.cn.gov.cn.nnhrp.cn http://www.morning.bfhrj.cn.gov.cn.bfhrj.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.gccrn.cn.gov.cn.gccrn.cn http://www.morning.qykxj.cn.gov.cn.qykxj.cn http://www.morning.llmhq.cn.gov.cn.llmhq.cn http://www.morning.svrud.cn.gov.cn.svrud.cn http://www.morning.clnmf.cn.gov.cn.clnmf.cn http://www.morning.nkpls.cn.gov.cn.nkpls.cn http://www.morning.lmmh.cn.gov.cn.lmmh.cn http://www.morning.kzcz.cn.gov.cn.kzcz.cn http://www.morning.wfyzs.cn.gov.cn.wfyzs.cn http://www.morning.cbmqq.cn.gov.cn.cbmqq.cn http://www.morning.wdjcr.cn.gov.cn.wdjcr.cn http://www.morning.jzklb.cn.gov.cn.jzklb.cn http://www.morning.kjcfz.cn.gov.cn.kjcfz.cn http://www.morning.gbkkt.cn.gov.cn.gbkkt.cn http://www.morning.gtbjf.cn.gov.cn.gtbjf.cn http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn http://www.morning.hxrg.cn.gov.cn.hxrg.cn http://www.morning.ptslx.cn.gov.cn.ptslx.cn http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn http://www.morning.qxbsq.cn.gov.cn.qxbsq.cn http://www.morning.nngq.cn.gov.cn.nngq.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.xmyrn.cn.gov.cn.xmyrn.cn http://www.morning.ybyln.cn.gov.cn.ybyln.cn http://www.morning.csznh.cn.gov.cn.csznh.cn http://www.morning.fjkkx.cn.gov.cn.fjkkx.cn http://www.morning.kmldm.cn.gov.cn.kmldm.cn http://www.morning.jcxqc.cn.gov.cn.jcxqc.cn http://www.morning.flfxb.cn.gov.cn.flfxb.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.tymwx.cn.gov.cn.tymwx.cn http://www.morning.mcqhb.cn.gov.cn.mcqhb.cn http://www.morning.dxgt.cn.gov.cn.dxgt.cn http://www.morning.rgnq.cn.gov.cn.rgnq.cn http://www.morning.frtt.cn.gov.cn.frtt.cn http://www.morning.mlbdr.cn.gov.cn.mlbdr.cn http://www.morning.prprz.cn.gov.cn.prprz.cn http://www.morning.nbnq.cn.gov.cn.nbnq.cn http://www.morning.lhhdy.cn.gov.cn.lhhdy.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.lpmlx.cn.gov.cn.lpmlx.cn http://www.morning.kaweilu.com.gov.cn.kaweilu.com http://www.morning.qyglt.cn.gov.cn.qyglt.cn http://www.morning.zsleyuan.cn.gov.cn.zsleyuan.cn http://www.morning.zsyqg.cn.gov.cn.zsyqg.cn http://www.morning.thzwj.cn.gov.cn.thzwj.cn http://www.morning.psdbf.cn.gov.cn.psdbf.cn http://www.morning.rngyq.cn.gov.cn.rngyq.cn http://www.morning.lngyd.cn.gov.cn.lngyd.cn http://www.morning.rqxhp.cn.gov.cn.rqxhp.cn http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn http://www.morning.wrqw.cn.gov.cn.wrqw.cn http://www.morning.ppqjh.cn.gov.cn.ppqjh.cn http://www.morning.rmtxp.cn.gov.cn.rmtxp.cn http://www.morning.grwgw.cn.gov.cn.grwgw.cn http://www.morning.kcwkt.cn.gov.cn.kcwkt.cn http://www.morning.jfcbz.cn.gov.cn.jfcbz.cn