用Python实现四叉树(quad tree)
前言
最近要使用四叉树(quad tree)来实现自适应分块,于是自己用Python实现了。
实现出来的效果如下:
算法思想
不断地对图像矩阵进行四分块,直到每个分块中的abs(最大灰度值max-最小灰度值min)<阈值threshold为止。
代码
import numpy as np
import cv2#正方形类
class square:#lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标def __init__(self,lx,ly,rx,ry):self.lx=lxself.ly=lyself.rx=rxself.ry=ry#检查该矩阵中是否满足条件#参数:原矩阵,阈值#返回值:布尔类型def check(self,matrix,threshold):#小于10的块就不再分了,太小没啥意义if abs(self.rx-self.lx)<=10:return Truemin=matrix[self.lx][self.ly]max=matrix[self.lx][self.ly]for i in range(self.lx,self.rx):for j in range(self.ly,self.ry):if matrix[i][j]<min:min=matrix[i][j]if matrix[i][j]>max:max=matrix[i][j]if abs(max-min)>=threshold:return Falsereturn True#打印正方形的坐标def print(self):print("lx:",self.lx,end=", ")print("ly:",self.ly,end=", ")print("rx:",self.rx,end=", ")print("ry:",self.ry)#检查所有块里面是否还有不行的
#参数:原矩阵、正方形对象列表
#返回值:若有不行的,返回对象和下标;否则返回空对象
def check_all(matrix,square_arr):for i in range(len(square_arr)):if square_arr[i].check(matrix,10)==False: #阈值在此设置return square_arr[i],ireturn None,-1#得到最终的四叉树
def get_quad_tree(matrix,square_arr):while(True):problem_block,index=check_all(matrix,square_arr)if problem_block==None:breaklx=problem_block.lxly=problem_block.lyrx=problem_block.rxry=problem_block.ry#左上角divide_block1=square(lx,ly,(lx+rx)//2,(ly+ry)//2)#右上角divide_block2=square(lx,(ly+ry)//2+1,(lx+rx)//2,ry)#左下角divide_block3=square((lx+rx)//2+1,ly,rx,(ly+ry)//2)#右下角divide_block4=square((lx+rx)//2+1,(ly+ry)//2+1,rx,ry)#检验结果是否正确# print("拆分前:")# square_arr[index].print()# print("拆分后:")# divide_block1.print()# divide_block2.print()# divide_block3.print()# divide_block4.print()#删掉原来的大矩阵,把新的四个子矩阵加进列表del square_arr[index]square_arr.append(divide_block1)square_arr.append(divide_block2)square_arr.append(divide_block3)square_arr.append(divide_block4)return square_arrdef resize(img, size):# print('src shape: ', img.shape)height = img.shape[0]width = img.shape[1]scalesize = 256.0timg = imgif height > width:timg = cv2.resize(img, (256, int(scalesize * height / width)))else:timg = cv2.resize(img, (int(scalesize * width / height), 256))# print('timg shape: ', timg.shape)th = timg.shape[0]tw = timg.shape[1]bh = int((th - size) / 2)bw = int((tw - size) / 2)rimg = timg[bh:bh + size, bw:bw + size]# print('rimg shape: ', rimg.shape)return rimgmask_np = cv2.imread('/auto_block/417_3.png', 0)
mask_np = resize(mask_np, 224)
matrix=mask_np
row=matrix.shape[0]
col=matrix.shape[1]
first_square=square(0,0,row-1,col-1)
square_arr=[first_square]
square_arr=get_quad_tree(matrix,square_arr)#划分界限,方便看
for i in square_arr:for col in range(i.ly,i.ry):mask_np[i.rx][col]=255for row in range(i.lx,i.rx):mask_np[row][i.ry]=255cv2.imwrite('/auto_block/result.png',mask_np)
# print(matrix)
# print("最终得到的各种分块如下:")
# for i in square_arr:
# i.print()
用Python实现四叉树(quad tree)相关推荐
- 【LeetCode】427. Construct Quad Tree 建立四叉树
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 427. Construct Quad Tree
1,题目要求 We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be t ...
- LeetCode #427 - Construct Quad Tree
题目描述: We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be tr ...
- leetcode 427. Construct Quad Tree(构建四叉树)
刚看到题的时候是懵的,这也太长了.到底是要表达什么呢. 不妨把这个矩阵看成一个正方形的图片,想象你在处理图片,从整体逐步到局部. 刚开始看一整张图片,如果是全0或全1,这个就是叶子节点,怎么表达叶子节 ...
- leetcode 427. Construct Quad Tree | 427. 建立四叉树(分治法)
题目 https://leetcode.com/problems/construct-quad-tree/ 题解 /* // Definition for a QuadTree node. class ...
- Python实现决策树(Decision Tree)分类
关于决策树的简介可以参考: http://blog.csdn.net/fengbingchun/article/details/78880934 在 https://machinelearningm ...
- LeetCode Construct Quad Tree(dfs)
问题:给出一个n*n由0和1组成的二维数组,用四叉树来表示网格.要求返回四叉树的根结点. (1)如果当前网格值相同,则是叶子结点,将网格值赋值给结点 (2)如果当前网格值不同,则不是叶子结点,结点值可 ...
- 详解python os.walk 实现 tree
os.walk & 实现tree 代码Doc 实现tree Directory tree generator 代码Doc Directory tree generator.For each d ...
- Python 生成圣诞树 Santa Tree Generator 不务正业系列#1
Python - Santa Tree Generator 环境 介绍 实现 方法一 思路 print 相关设置 格式分解 示例 相关设置值 代码 方法二 环境 OS: Windows 10 专业版 ...
最新文章
- Linux那些事儿 之 戏说USB(24)设备的生命线(七)
- 使用Eclipse EE(汉化版) 创建一个JavaWeb工程
- mysql查看所有存储过程,函数,视图,触发器,表
- UA MATH565C 随机微分方程V Markov Family的特征函数
- pytorch切片,numpy切片的总结,以及数组切片常用操作的总结
- jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现
- Java中的一些坑,汇总篇(2万字)
- 【hdu2481】Toy,burnside引理+矩阵乘法
- RocketMQ(六)—IndexFile详解
- 美团饿了么接连宕机 只因天气太热
- Openssl多个安全补丁简易分析危害及修复方案
- spring3.1.1与commons-dbcp1.2的冲突?
- STM32F103RCT6移植到STM32F103C8T6注意事项
- 考勤机信息同步不到服务器,考勤机实时同步功能上线啦
- 诺基亚Nokia的PC套件导出短信乱码问题解决(转)
- 尚学堂马士兵servlet/JSP笔记(一、Http协议及WebApp初步)
- 基于python爬虫数据分析论文_基于Python的招聘网站信息爬取与数据分析
- 库存管理中的 (s, S) 策略,K convex,K 凸
- nexus私服npm包踩坑记录
- python:实现Lempel-Ziv压缩算法(附完整源码)
热门文章
- Android11 读写权限申请
- 音箱选购必备20秘诀
- 图像质量评价数据库TID2013 网盘下载
- java 如何获取设备号_java – 如何获取android设备ID?
- php中有关文件包含的函数有哪些,文件包含有关
- LG30刷小米系统_闲鱼300块入手小米平板1,性能居然秒杀1099的小米平板4
- 33220a 编程C语言,基于AT89C51单片机的数字式波形发生器(非常完整).doc
- 给软件添加注册码【笔记】
- PMP 冲突管理常用的五种方法
- 通信人每天挂在嘴边的“网管”,到底是个啥东东?