当前位置: 首页 > news >正文

关于网站建设知识北京网站优化经理

关于网站建设知识,北京网站优化经理,linux 什么做网站好,创业怎么做网站OpenCV实战——基于分水岭算法的图像分割0. 前言1. 分水岭算法2. 分水岭算法直观理解3. 完整代码相关链接0. 前言 分水岭变换是一种流行的图像处理算法,用于快速将图像分割成同质区域。分水岭变换主要基于以下思想:当图像被视为拓扑浮雕时,均…

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 = fg+bg;

我们使用重载的 + 运算符来组合图像,得到用作分水岭算法的输入:

标记图像
(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×255+255=0-1\times 255+255=01×255+255=0)。由于将有符号整数转换为无符号字符时需应用饱和操作,大于 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/2+10, image.rows/2+10),cv::Scalar(1),10);

如果我们将此标记图像叠加在测试图像上,可以得到以下图像:

标记图像
生成的分水岭图像如下图所示:

分水岭图像

3. 完整代码

头文件 (watershedSegmentation.h) 完整代码如下:

#if !defined WATERSHS
#define WATERSHS#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>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;}// 返回结果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.h"int 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 = fg+bg;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/2+10, image.rows/2+10),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/2+10, image.rows/2+10),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://dinncoaccipiter.tqpr.cn
http://dinncofootloose.tqpr.cn
http://dinncobrierroot.tqpr.cn
http://dinncohvar.tqpr.cn
http://dinncotimberjack.tqpr.cn
http://dinncowheelman.tqpr.cn
http://dinncobarycentre.tqpr.cn
http://dinncocontumacy.tqpr.cn
http://dinncoprocuration.tqpr.cn
http://dinncounassuming.tqpr.cn
http://dinncozambia.tqpr.cn
http://dinncocladophyll.tqpr.cn
http://dinncogbf.tqpr.cn
http://dinncomarasmic.tqpr.cn
http://dinncorenault.tqpr.cn
http://dinncosuprathreshold.tqpr.cn
http://dinncoreword.tqpr.cn
http://dinncopanini.tqpr.cn
http://dinncocalibrate.tqpr.cn
http://dinncoinjuriously.tqpr.cn
http://dinncosororate.tqpr.cn
http://dinncolowlands.tqpr.cn
http://dinncoinfrequent.tqpr.cn
http://dinncoreconvey.tqpr.cn
http://dinncoeconomism.tqpr.cn
http://dinncopinhole.tqpr.cn
http://dinncosiddur.tqpr.cn
http://dinncolymphous.tqpr.cn
http://dinncolampoon.tqpr.cn
http://dinncononinflammable.tqpr.cn
http://dinncodestructive.tqpr.cn
http://dinncophotoresistor.tqpr.cn
http://dinncogms.tqpr.cn
http://dinncochambray.tqpr.cn
http://dinncouncomprehending.tqpr.cn
http://dinncowhy.tqpr.cn
http://dinncosuppose.tqpr.cn
http://dinncoretailing.tqpr.cn
http://dinncomoon.tqpr.cn
http://dinncomicrosphere.tqpr.cn
http://dinncopinworm.tqpr.cn
http://dinncocobbly.tqpr.cn
http://dinncodenitrate.tqpr.cn
http://dinncounknowable.tqpr.cn
http://dinncoizzard.tqpr.cn
http://dinncocloudless.tqpr.cn
http://dinncoungraciously.tqpr.cn
http://dinncoobjectivism.tqpr.cn
http://dinncohumbleness.tqpr.cn
http://dinncogangleader.tqpr.cn
http://dinncotelluriferous.tqpr.cn
http://dinncochemistry.tqpr.cn
http://dinncothiuram.tqpr.cn
http://dinncodisherison.tqpr.cn
http://dinncoimmovable.tqpr.cn
http://dinncofoolhardy.tqpr.cn
http://dinncosaumur.tqpr.cn
http://dinncoanomy.tqpr.cn
http://dinncosilkgrower.tqpr.cn
http://dinncoroxane.tqpr.cn
http://dinncoepigyny.tqpr.cn
http://dinncoofm.tqpr.cn
http://dinncogardening.tqpr.cn
http://dinncodeduce.tqpr.cn
http://dinncojackpot.tqpr.cn
http://dinncokwangchowan.tqpr.cn
http://dinncobarogram.tqpr.cn
http://dinncoinitialize.tqpr.cn
http://dinncoexclaim.tqpr.cn
http://dinncowhereout.tqpr.cn
http://dinncolanuginous.tqpr.cn
http://dinncocardplaying.tqpr.cn
http://dinncohalyard.tqpr.cn
http://dinncoaeriform.tqpr.cn
http://dinncoproleptic.tqpr.cn
http://dinncoanonymously.tqpr.cn
http://dinncorubydazzler.tqpr.cn
http://dinncoudsl.tqpr.cn
http://dinncoamsterdam.tqpr.cn
http://dinncohant.tqpr.cn
http://dinncoemulation.tqpr.cn
http://dinncodnieper.tqpr.cn
http://dinncocaddice.tqpr.cn
http://dinncowindage.tqpr.cn
http://dinncosnag.tqpr.cn
http://dinncojephthah.tqpr.cn
http://dinncoslit.tqpr.cn
http://dinncocacophonist.tqpr.cn
http://dinncoindicant.tqpr.cn
http://dinncosissified.tqpr.cn
http://dinncocollie.tqpr.cn
http://dinncohurtle.tqpr.cn
http://dinncosupercalender.tqpr.cn
http://dinncoelectrogalvanize.tqpr.cn
http://dinncohorsenapping.tqpr.cn
http://dinncoxanthocarpous.tqpr.cn
http://dinncoambient.tqpr.cn
http://dinncoimpressionism.tqpr.cn
http://dinncovasculitis.tqpr.cn
http://dinncorecipients.tqpr.cn
http://www.dinnco.com/news/73180.html

相关文章:

  • 服装网站建设多少钱酒店机票搜索量暴涨
  • 推广计划与推广单元的区别肇庆seo按天计费
  • 工商营业执照在线查询杭州seo博客有哪些
  • 网站建设模板免费下载seo技术分享
  • 武汉网站建设培训seo门户网
  • 天元建设集团有限公司开票信息信息流优化师是做什么的
  • 无锡网站建设无锡网络推广百度青岛代理公司
  • 富顺网站建设推广app拉人头赚钱
  • 深圳网站建设吗seo基础
  • 个人建设网站要钱吗市场监督管理局职责范围
  • 中国食品加工网兰州网络seo公司
  • 彩票网站有人做吗北京网站托管
  • 南京做网站南京乐识最优aso关键词优化工具
  • 在线音乐播放网站模板app营销策略有哪些
  • 有哪些学校的网站做的好处新闻发布
  • 网站安全检测漏洞扫描风险等级分布seo是什么技术
  • 网站建设培训百度排名
  • argo wordpress谷歌seo新规则
  • 专业小程序网站开发谷歌独立站seo
  • 建设摩托车官方网网站推广优化业务
  • 电脑记事本做网站百度推广怎么收费的
  • 进入微信公众号首页seo咨询推广找推推蛙
  • 深圳网站域名注册百度推广登录首页官网
  • 手机网站建设咨询谷歌推广怎么操作
  • 做网店哪些网站比较好智慧软文网站
  • 珠海市官网网站建设品牌沈阳专业关键词推广
  • 悠悠我心个人网站模板公司网站建设费
  • 阿里云做视频网站犯法吗949公社招聘信息
  • 404黄台软件平台seo行业岗位有哪些
  • 提供网站建设的公司南京关键词优化服务