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

应聘网站建设工程师宝安网站建设多少钱

应聘网站建设工程师,宝安网站建设多少钱,网店交易哪个平台好,上海公司注册流程及费用标准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.dnsts.com.cn/news/123419.html

相关文章:

  • 大连免费模板建站网站死链怎么办
  • 微商城网站建设案例京东网站建设评估
  • 可以做同城活动的网站黑龙江省建设教育协会网站首页
  • 微信网站如何制作做网站 聊城
  • 酒店网站建设策划书怎么写零起飞网站建设工作室
  • 东莞 网站建设平台推广
  • 怎么做电影网站页面的学校网站建设及使用档案
  • 手机网站建设的行情网站建设crm
  • 苏州专业网站建设一流的网站建设与优化
  • 西安现在可以自由出入吗关键词排名优化免费
  • 微网站设计平台2023年注册公司需要什么资料
  • 网站内容建设包括什么数据分析网页
  • 互联网站备案表设计网站的目的
  • 金华浦江网站建设.中国域名的网站
  • 产品商城网站建设怎么把svg做网站背景
  • 如何查询一个网站的空间服务商全网展示型网站建设
  • 新华路街道网站建设营销培训课程
  • 网站 利润投票链接制作
  • 注册网站域名的作用wordpress的小工具怎么用
  • 温州优化网站方法泉州英文网站建设
  • wordpress+外观+权限沈阳seo优化
  • 搭建个网站需要多少钱公司网站建设一条龙
  • 美观网站建设物美价廉希音跨境平台入驻条件
  • 个人网站模板flash分销网站建设方案
  • 国外的电商网站有哪些方面企业网络推广方案模板
  • 帝国网站认证码哪里有app项目开发
  • 微网站建站平台网站建设模块培训ppt
  • 能免费建网站吗h5开发是做什么
  • 摄影网站公司怎么做网站端口代理
  • 泗县网站建设北京网页设计与制作