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

网站建设专业名词解释网站湛江企业网站建设

网站建设专业名词解释网站,湛江企业网站建设,深圳模板建站代理,关键词优化的技巧文章目录图像区域基本算法——形态学运算腐蚀与膨胀开运算与闭运算opencv中的形态学运算距离计算——distanceTransform函数连通域连通的定义计算连通域——connectedComponents连通域实验基于区域的分割区域生长算法自定义一个最简单区域生长算法实现区域分割一般区域分割open… 文章目录图像区域基本算法——形态学运算腐蚀与膨胀开运算与闭运算opencv中的形态学运算距离计算——distanceTransform函数连通域连通的定义计算连通域——connectedComponents连通域实验基于区域的分割区域生长算法自定义一个最简单区域生长算法实现区域分割一般区域分割opencv中的分水岭算法分水岭算法原理简单说明分水岭算法使用前面两篇文章说的分割一个是基于阈值的分割一个是基于边缘算法的分割。在传统的图像处理算法中还有一个大类是基于区域的分割。图像区域基本算法——形态学运算 基于区域的分割需要先补充一点其他的预备知识首先是图像形态学。 图像形态学就是对图像在形态上的一些算法或者说运算。 腐蚀与膨胀 腐蚀和膨胀使形态学运算中最基本的用法这个在之前的文章里描述过opencv中的原理和具体用法 https://blog.csdn.net/pcgamer/article/details/124729236?spm1001.2014.3001.5502 这里就不多说了。 开运算与闭运算 在形态学运算中还定义了另外了两个运算 开运算先腐蚀图像再膨胀图像同样需要一个kernel。闭运算先膨胀图像再腐蚀图像同样需要一个kernel。 opencv中的形态学运算 opencv中除了提供了腐蚀膨胀这些基本函数之外还弄了一个综合函数cv2.morphologyEx 这个函数可以对图像进行各种形态学操作由其中一个参数op确认可执行的运算列表根据枚举量MorphTypes确定 官网上的这张图像说的非常的明白。 其他的参数和腐蚀和膨胀基本类似。 距离计算——distanceTransform函数 cv2.distanceTransform这个函数计算了一幅图像当中每个点与最近的0像素点之间的距离如果本身像素为0那么就等于0. 关于距离的定义可以有三种选项(opencv官网) 还有一个参数是maskSize我理解是在哪个范围之内进行计算官网上也是提供了三个选项 如果是DIST_MASK_PRECISE的话就是在整张图中进行计算。 具体是用什么算法优化和减少计算量官网上也提供了文献有兴趣的朋友可以去了解了解。 连通域 连通域是图像运算中的一个重要概念就是判断两个区域是否是连接的。 连通的定义 首先两个像素怎么才叫连通这个是可以定义的比如两个像素像素值相同算连通或者说两者相差不超过N之类。 其次一个像素和周边的像素比较的时候一般有下面几种方式。 4连通像素和周边的四个像素点进行比较(按照上面的规则进行比较)就是上、下、左、右四个像素点。如果4个点都是与当前像素点相连通那么说这几个像素点组成的区域就是一个4连通区域很多区域生长算法就是以这个为标准来进行计算和生长的。 或者反过来说一个区域是一个4连通区域的话这个区域中的像素点与其周边的四个像素点都是连通的(最外边的一圈除外) 8连通和上面的类似就是像素点的8个邻域像素点都是连通的。 计算连通域——connectedComponents 这个函数就是用来做连通域计算的有如下的参数 image: 图像单通道的8位图像。 connectivity使用4连通还是8连通。直接填4或者8. ltype返回的图像数据(在返回值那里说)使用CV_32S或者CV_16U。 ccltype实用计算连通域的算法我的python版本好像没有这个入参 每一种都有对应的论文去阐述不细说。 返回值有两个 ret返回有几个连通域就是上面的ltypelabels连通域的图像。实际上计算的结果就是给输入图像的每个区域打个标记标记一下这是哪个连通域的。如果标记为0则为背景。 连通域实验 直接上代码 img cv2.imread(/Users/zoulei/files/personal/blog/images/car.jpeg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(grey, gray)ret, markers cv2.connectedComponents(gray)img[markers 0] [0, 0, 0]#就直接使用三原色对不同的连通域进行涂色 colors [[255, 0, 0],[0, 255, 0],[0, 0, 255] ]for i in range(1, ret1):# python中的特有方式好用的很img[markers i] colors[i % 3]cv2.imshow(component, img)结果如下 结果不太理想还需要别的动作。不是这篇的重点后续再说 基于区域的分割 区域生长算法 基于区域的分割逻辑上比较简单就是需要分割出来的区域理论上来说其中的像素值是相似的或者说是有关联的。那么算法可以引入一个先验知识或者说一个前提算法的初始条件中就需要增加一个种子点。 这个种子点就是从各个需要分割区域中挑选出来的点(通过各种手段可以是手动可以是自动后续会详细讲到)来根据相似性进行扩展(生长)一直生长到区域的边缘为止(停止生长)。 所以区域生长算法的几个关键问题就是 如何挑选生长点如何确定生长原则如何确定生长停止条件 各种各样的算法就是针对这三个问题提出各自的解决方案。 自定义一个最简单区域生长算法实现 为了理解这个算法我弄了一个最简单区域生长。 固定一个点作为种子节点往四个方向生长只要像素差值小于20就生长而且生长规则是直接赋值停止规则也很简单100个迭代 代码如下 if __name__ __main__:img cv2.imread(/Users/zoulei/files/personal/blog/images/tubeImg.jpeg)grey cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(origin, grey)# 随便挑一个点作为种子点point_x 100point_y 100grey[point_x, point_y] 255# 四个生长方向# 如果差值超过20就停下# 暂时先生成20个迭代for i in range(100):if grey[point_x - i, point_y] - 255 20:grey[point_x - i, point_y] 255if grey[point_x i, point_y] - 255 20:grey[point_x i, point_y] 255if grey[point_x, point_y - i] - 255 20:grey[point_x, point_y - i] 255if grey[point_x, point_y i] - 255 20:grey[point_x, point_y i] 255cv2.imshow(changed, grey)cv2.waitKey()cv2.destroyAllWindows()输出的图像为 也就是说通过4个方向的简单生长变成了一个十字形的区域或者说分割出了一个十字形的区域。 我们可以通过修改种子点生长规则和停止规则来确定一种新的区域分割算法分水岭算法就是其中的一个代表算法而opencv里提供了函数watershed来实现一种分水岭算法(分水岭算法也有很多种变形我只说说opencv的实现算法)。 区域分割 一般区域分割 一般来说可以直接使用连通域函数函数来做区域分割我们也拿一个硬币图来实验。 当然不能直接使用连通域计算的函数还需要做一些预处理 img cv2.imread(/Users/zoulei/files/personal/blog/images/coin.jpg)grey cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, thresh_img cv2.threshold(grey, 50, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)kernel cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))opening cv2.morphologyEx(thresh_img, cv2.MORPH_OPEN, kernel, iterations2)ret, markers cv2.connectedComponents(opening)for i in range(1, ret1):# python中的特有方式好用的很img[markers i] colors[i % 3]结果不甚理想 感觉是最下面两个分成了两个区域多膨胀几次试试看 img cv2.imread(/Users/zoulei/files/personal/blog/images/coin.jpg)grey cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, thresh_img cv2.threshold(grey, 50, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)kernel cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))opening cv2.morphologyEx(thresh_img, cv2.MORPH_OPEN, kernel, iterations2)dialate cv2.dilate(opening, kernel, iterations3)ret, markers cv2.connectedComponents(dialate)for i in range(1, ret1):# python中的特有方式好用的很img[markers i] colors[i % 3]很明显如果两个区域隔的比较近一膨胀就容易让两个区域变成一个连通域。那么针对这种两个区域有比较接近的边界的情况有一种区域生长算法是叫做分水岭算法。 opencv中的分水岭算法 watershed函数有两个参数 imgage, 输入图像一个3通道图。marker单通道的图像有点类似于掩膜的作用具体的作用我们下面会具体讲到。 分水岭算法原理简单说明 首先说一下为什么要用分水岭算法我一直有个疑问的是opencv里面提供了connectedComponents函数来计算连通域(也有不同的算法opencv中提供了参考文献)。那么分水岭算法和那些有什么区别呢我个人的理解是在需分割区域的边界比较接近的时候比较有用就和我上面提到的例子一样一般来说用基于区域的算法进行分割的时候通常会使用膨胀算法对内部的杂质或者空洞就行补充但是如果使用了膨胀因为分割区域挨的比较近就会导致变成一个连通区域了。 这个时候就可以用到分水岭算法 分水岭算法的基本逻辑是把整张图像的灰度值或者是像素值想象成一个地形图灰度值较低的是山谷或者说盆地灰度值较高的像素点就是山峰。 假设从图像上的盆地开始往图像里注水水平面慢慢上升就会形成一个一个的水坑或者湖就是一个一个的区域。当两块水域连接到一起的时候这里就可以停止注水了这样就形成了一个边界就可以完成区域分割操作了。在opencv的分水岭算法中通过第二个参数marker来给出种子点进行生长。opencv的分水岭算法中是需要基于连通域算法的。 上面是一个基本原理下面来说说具体的使用。 分水岭算法使用 我们还是使用上面的硬币图来进行实验。 我简单说说我对分水岭算法的理解 上面提到了分水岭算法是基于连通域算法的基础的。也就是说要通过连通域算法来给图像的每个区域进行编号这些编号就是给分水岭算法提供的种子点标记了这些已经是一块一块的区域了。分水岭分割算法的目标是要区分出前景区域和背景区域来。分水岭算法中的markker主要分为三类区域前景区域(数字标记为123等等)背景区域数字标记为-1。unkonwn区域数字标记为0。这个就是用于解决连通域区域无法很好解决的边界过近通过膨胀会连在一起的情况。分水岭算法的主要逻辑就是通过确定好一些前景区域种子点然后确定一些背景区域中间模糊的区域就是unknown区域。然后通过注水过程来在模糊区域中找到边界。 根据上面的基本逻辑详细说说应用分水岭算法的代码 计算背景区域 img cv2.imread(./images/coin.jpg)grey cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, thresh_img cv2.threshold(grey, 50, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)kernel cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))opening cv2.morphologyEx(thresh_img, cv2.MORPH_OPEN, kernel, iterations2)# 背景区域sure_bg cv2.dilate(opening, kernel, iterations2)上面代码中最后一句是通过一次膨胀来确定背景区域。我是这么理解这个代码的通过一次threshold的区域分割后基本上已经将前景区域大致轮廓找到了经过一次膨胀后就会比目标区域的范围更大就可以把这样的一个区域称作为背景区域。 显示出来看一下 很明显是比目标区域宽一些了。 计算前景区域 # 前景区域dist_transform cv2.distanceTransform(opening, cv2.DIST_L2, 5)ret, sure_fg cv2.threshold(dist_transform, 0.2 * dist_transform.max(), 255, cv2.THRESH_BINARY)这几句代码我理解了一阵子。 distanceTransform函数计算的就是图像中离0最近的像素点的距离。 那么上面的第一句代码计算得到的就是经过开运算之后的前景区域离后面的黑色背景区域的距离。 配合下一句代码的threshold函数对计算的距离进行阈值运算就是如果是小于距离最大值的0.2的点就为像素值0否则则是255. 这两句可以理解为就是缩小开运算之后的目标区域这部分区域确定为前景区域。 显示出来看一下就是 区域小多了。那么实际上的边界就会存在于这个前景和背景之间分水岭算法的任务就是要在这个区域中找到真实的边界。 在unknown区域中应用分水岭算法找到边界 fg和bg的中间范围就是上面逻辑中提到的unknown区域也就是不确定区域。 显示出来结果如下 sure_fg np.uint8(sure_fg) unknown cv2.subtract(sure_bg, sure_fg)ret, markers cv2.connectedComponents(sure_fg)markers[unknown 255] 0markers cv2.watershed(img, markers)img[markers-1] [0, 0, 255]上面的代码中用bg图减去fg图就是中间区域。然后通过连通域算法得到前景区域中的区域标记。markers[unknown 255]这句代码就是通过把unknown这个mat中等于255的在marker这个mat的标记中标记为0.还记得上面提到的逻辑么0就表示unknown区域。最后应用watershed算法。最后一句watershed算法计算完成后marker中为-1的像素值就是边界(marker的尺寸和原图一样) 最终的结果如下 通过分水岭算法就可以较为准确的找到边界。 当然上图中还有一些多余的分割线我觉得是可以通过对上面的unknown区域做一些改进和处理是可以去除掉这些分割线的这里就不在这里多说了。有兴趣的朋友也可以自行尝试。
http://www.tj-hxxt.cn/news/138661.html

相关文章:

  • 包头有没有专业做淘宝网站的代码运行框wordpress6
  • 网站举报查询大庆哈尔滨网站建设
  • 网站首页空白 wordpress计算机科学专业就业方向
  • 阿里巴巴网站建设规划it运维职业规划
  • 怎么做网站主页设计高端网站建设步骤
  • 仿京东网站后台学设计在哪学比较好
  • 做交互网站做一个在线交易网站需要多少钱
  • 色块布局网站首页模板好的公司网站有什么用
  • 亚当学院网站建设视频教程长沙官网seo技术
  • 网站模板套用顺德网页定制
  • 苏州快速建设网站公司深圳建设交易平台官网
  • ui设计网站成品图片如何建立像百度一样的网站
  • 北京seoqq群西安优化外包
  • 专业型网站和个人网站长春商城网站开发
  • 视频网站VIP卡怎么做赠品wordpress电商模板下载
  • 网站开发电脑配置推荐百度关键字搜索量查询
  • 素材网站无水印深圳广告公司招聘
  • 网站开场动画怎么做网站怎么放404页面
  • 全网最低价查询网站娄底网站建设方案
  • 江西景德镇建设厅网站做外汇的网站
  • 网站微信二维码侧边栏漂浮框餐饮logo免费设计
  • 无锡网站排名优化费用2017年网站建设公司
  • 深圳建站的公司上海园区虚拟地址一览表
  • 张家港网站建设做网站徐州网站简介
  • 建工网官方网站wordpress防转载
  • 优化 网站访问速度益阳市网站建设
  • 免费合同模板网站网页设计与网站的关系
  • 河南第一火电建设公司网站一个人制作网站
  • 便利的龙岗网站设计建设和住房保障部 网站
  • 网站开发费 无形资产阿里云 win wordpress 伪静态