前言

最近要使用四叉树(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)相关推荐

  1. 【LeetCode】427. Construct Quad Tree 建立四叉树

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  2. 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 ...

  3. 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 ...

  4. leetcode 427. Construct Quad Tree(构建四叉树)

    刚看到题的时候是懵的,这也太长了.到底是要表达什么呢. 不妨把这个矩阵看成一个正方形的图片,想象你在处理图片,从整体逐步到局部. 刚开始看一整张图片,如果是全0或全1,这个就是叶子节点,怎么表达叶子节 ...

  5. leetcode 427. Construct Quad Tree | 427. 建立四叉树(分治法)

    题目 https://leetcode.com/problems/construct-quad-tree/ 题解 /* // Definition for a QuadTree node. class ...

  6. Python实现决策树(Decision Tree)分类

    关于决策树的简介可以参考: http://blog.csdn.net/fengbingchun/article/details/78880934 在  https://machinelearningm ...

  7. LeetCode Construct Quad Tree(dfs)

    问题:给出一个n*n由0和1组成的二维数组,用四叉树来表示网格.要求返回四叉树的根结点. (1)如果当前网格值相同,则是叶子结点,将网格值赋值给结点 (2)如果当前网格值不同,则不是叶子结点,结点值可 ...

  8. 详解python os.walk 实现 tree

    os.walk & 实现tree 代码Doc 实现tree Directory tree generator 代码Doc Directory tree generator.For each d ...

  9. Python 生成圣诞树 Santa Tree Generator 不务正业系列#1

    Python - Santa Tree Generator 环境 介绍 实现 方法一 思路 print 相关设置 格式分解 示例 相关设置值 代码 方法二 环境 OS: Windows 10 专业版 ...

最新文章

  1. Linux那些事儿 之 戏说USB(24)设备的生命线(七)
  2. 使用Eclipse EE(汉化版) 创建一个JavaWeb工程
  3. mysql查看所有存储过程,函数,视图,触发器,表
  4. UA MATH565C 随机微分方程V Markov Family的特征函数
  5. pytorch切片,numpy切片的总结,以及数组切片常用操作的总结
  6. jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现
  7. Java中的一些坑,汇总篇(2万字)
  8. 【hdu2481】Toy,burnside引理+矩阵乘法
  9. RocketMQ(六)—IndexFile详解
  10. 美团饿了么接连宕机 只因天气太热
  11. Openssl多个安全补丁简易分析危害及修复方案
  12. spring3.1.1与commons-dbcp1.2的冲突?
  13. STM32F103RCT6移植到STM32F103C8T6注意事项
  14. 考勤机信息同步不到服务器,考勤机实时同步功能上线啦
  15. 诺基亚Nokia的PC套件导出短信乱码问题解决(转)
  16. 尚学堂马士兵servlet/JSP笔记(一、Http协议及WebApp初步)
  17. 基于python爬虫数据分析论文_基于Python的招聘网站信息爬取与数据分析
  18. 库存管理中的 (s, S) 策略,K convex,K 凸
  19. nexus私服npm包踩坑记录
  20. python:实现Lempel-Ziv压缩算法(附完整源码)

热门文章

  1. Android11 读写权限申请
  2. 音箱选购必备20秘诀
  3. 图像质量评价数据库TID2013 网盘下载
  4. java 如何获取设备号_java – 如何获取android设备ID?
  5. php中有关文件包含的函数有哪些,文件包含有关
  6. LG30刷小米系统_闲鱼300块入手小米平板1,性能居然秒杀1099的小米平板4
  7. 33220a 编程C语言,基于AT89C51单片机的数字式波形发生器(非常完整).doc
  8. 给软件添加注册码【笔记】
  9. PMP 冲突管理常用的五种方法
  10. 通信人每天挂在嘴边的“网管”,到底是个啥东东?