OpenCV与图像处理学习十——区域生长算法(含代码)

  • 一、区域生长算法概要
  • 二、区域生长算法原理
  • 三、代码应用

一、区域生长算法概要

区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止

区域生长的好坏决定于:

  1. 初始点(种子点)的选取。
  2. 生长准则。
  3. 终止条件。

区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取

二、区域生长算法原理

基本思想:将具有相似性质的像素集合起来构成区域。

步骤:

  1. 对图像顺序扫描,找到第1个还没有归属的像素, 设该像素为(x0, y0);
  2. 以(x0, y0)为中心, 考虑(x0, y0)的4邻域像素(x, y)如果(x0,y0)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈(即满足条件,被判定为和(x0, y0)属于一个区域,后面需要再从这些点往外继续生长,所以需要保存);
  3. 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2(继续往外生长);
  4. 当堆栈为空时,返回到步骤1(有像素可能不属于前面的区域);
  5. 重复步骤1 - 4直到图像中的每个点都有归属时;生长结束。

三、代码应用

这里为简单起见,我们只设置了一个区域,即上述步骤中的第四步改为,当堆栈为空时,生长结束。

我们需要分割的图像如下所示:

我们将生长准则设置为像素值之间的欧式距离小于某个阈值,也就是说相邻像素值的差异较小时,归类为一个区域,代码如下所示:

# -*- coding:utf-8 -*-
import cv2
import numpy as np
###########################################################################################################################################################################
class Point(object):def __init__(self, x, y):self.x = xself.y = ydef getX(self):return self.xdef getY(self):return self.y
connects = [Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0),Point(1, 1), Point(0, 1), Point(-1, 1), Point(-1, 0)]
#####################################################################################
# 计算两个点间的欧式距离
def get_dist(seed_location1, seed_location2):l1 = im[seed_location1.x, seed_location1.y]l2 = im[seed_location2.x, seed_location2.y]count = np.sqrt(np.sum(np.square(l1-l2)))return count# import Image
im = cv2.imread('./image/222.jpg')
cv2.imshow('src', im)
cv2.waitKey(0)
cv2.destroyAllWindows()
im_shape = im.shape
height = im_shape[0]
width = im_shape[1]print('the shape of image :', im_shape)# 标记,判断种子是否已经生长
img_mark = np.zeros([height, width])
cv2.imshow('img_mark', img_mark)
cv2.waitKey(0)
cv2.destroyAllWindows()# 建立空的图像数组,作为一类
img_re = im.copy()
for i in range(height):for j in range(width):img_re[i, j][0] = 0img_re[i, j][1] = 0img_re[i, j][2] = 0
cv2.imshow('img_re', img_re)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 取一点作为种子点
seed_list = []
seed_list.append(Point(15, 15))
T = 7           # 阈值
class_k = 1     # 类别
# 生长一个类
while (len(seed_list) > 0):seed_tmp = seed_list[0]# 将以生长的点从一个类的种子点列表中删除seed_list.pop(0)img_mark[seed_tmp.x, seed_tmp.y] = class_k# 遍历8邻域for i in range(8):tmpX = seed_tmp.x + connects[i].xtmpY = seed_tmp.y + connects[i].yif (tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= width):continuedist = get_dist(seed_tmp, Point(tmpX, tmpY))# 在种子集合中满足条件的点进行生长if (dist < T and img_mark[tmpX, tmpY] == 0):img_re[tmpX, tmpY][0] = im[tmpX, tmpY][0]img_re[tmpX, tmpY][1] = im[tmpX, tmpY][1]img_re[tmpX, tmpY][2] = im[tmpX, tmpY][2]img_mark[tmpX, tmpY] = class_kseed_list.append(Point(tmpX, tmpY))########################################################################################
# 输出图像
cv2.imshow('OUTIMAGE', img_re)
cv2.waitKey(0)
cv2.destroyAllWindows()

分割得到的结果如下所示:

很显然,天空的像素值较为接近,所以被生长为一片区域,而房屋的像素与天空的差异较大,当天空的区域生长结束之后,因为这里只设置了分割一块区域,所以下面的房屋部分没有遍历到。

OpenCV与图像处理学习十——区域生长算法(含代码)相关推荐

  1. OpenCV与图像处理学习十四——SIFT特征(含代码)

    OpenCV与图像处理学习十四--SIFT特征(含代码) 一.SIFT算法 二.SIFT实现过程 三.代码实现 一.SIFT算法 SIFT, 即尺度不变特征变换算法(Scale-invariant f ...

  2. OpenCV与图像处理学习十五——LBP纹理特征(含代码)

    OpenCV与图像处理学习十五--LBP纹理特征(含代码) 一.LBP介绍 二.LBP原理 三.代码应用 一.LBP介绍 LBP(Local Binary Pattern, 局部二值模式) , 是一种 ...

  3. OpenCV与图像处理学习十一——分水岭算法(含代码)

    OpenCV与图像处理学习十一--分水岭算法(含代码) 一.分水岭算法概要 二.分水岭算法步骤 三.代码应用 一.分水岭算法概要 任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方 ...

  4. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

  5. OpenCV与图像处理学习十二——图像形状特征之HOG特征

    OpenCV与图像处理学习十二--图像形状特征之HOG特征 一.图像特征理解 1.1 颜色特征 1.2 纹理特征 1.3 形状特征 1.4 空间关系特征 二.形状特征描述 2.1 HOG特征 2.1. ...

  6. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  7. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  8. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

  9. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

最新文章

  1. 在Android Studio中打开Android Device Monitor时报错的解决方法
  2. EOS 智能合约源代码解读 (3)asset.hpp
  3. python mysql数据库操作grid控件_Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能...
  4. springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...
  5. case class和trait
  6. 绘制矩形php,php绘制一个矩形的方法
  7. 洛谷——P1706 全排列问题
  8. html页面如何接受提示参数,html页面如何象asp一样接受参数_javascript教程
  9. 一个卡片式的ViewPager,带你玩转ViewPager的PageTransformer属性!
  10. 挑战性题目DSCT102:木板切割问题
  11. 电脑控制手机 易语言也可以实现颜色比较功能哦
  12. 深度学习怎么入门?零基础快速入门深度学习
  13. springboot文件上传大小限制:The field file exceeds its maximum permitted size of 1048576 bytes
  14. POJ 3764 Trie + 贪心
  15. 火狐插件 打开html 死机,火狐flash插件崩溃(Firefox火狐Flash插件卡死问题完美解决方法)...
  16. CSDN博客专家申请成功
  17. Certbot的使用
  18. 生命不息学习不止 分析几个大牛爱用的在线笔记工具
  19. 内存重叠的拷贝--memmove
  20. 计算机VB语言VERSION,怎么用VB获得电脑中excel的版本号

热门文章

  1. Hive的数据加载与导出
  2. 论文浅尝 | 动态词嵌入
  3. 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)
  4. 【LeetCode】4月2日打卡-Day18-矩阵操作
  5. QNX下挂载USB设备
  6. 解决表单提交的数据丢失问题
  7. 12月25晚-12月29日做的两个网页
  8. Sprint2-3.0
  9. MYSQL 定时任务
  10. C#语言之“中英文混合字符串对齐”的方法