赞
踩
先上几张图,项目代码在最下面,可直接食用
GUI 用的是python的EasyGui
安装方法(我用的是ubuntu18.04系统)
sudo apt-get install python3-easygui
EasyGui使用方法: https://www.cnblogs.com/fuqia/p/8992438.html
每个像素的颜色由RGB三个颜色组成,而且RGB每个颜色的范围是0~255,转换为二进制就是0~2^8-1,也就是用8位二进制可以表示。RGB三种颜色拼接在一起就成24位的二进制,这个会严重降低后面的运行速度,所以每种颜色的8位二进制数只取前两位来表示该颜色,例如:R这种颜色是01101111,则用01代替。所以每个像素的颜色由一个6位二进制数表示。
像素的颜色的取值范围0~63,若以0~63为横坐标,图像中颜色的值分别以 0 到 63的像素的个数为纵坐标,来构建颜色直方图。图像的特征向量可以表示为一个 64 维的向量 x = ( x 1 , x 2 , x 3 , ..., x 64 ),然后有N副图片,对于整个特征库来说可以用一个 N * 64 的矩阵来表示:
不同于普通的K-means,二分k-means会根据用户给定的分类个数而将数据分成几类。
1、确定一个初始类心
对 N * 64 的矩阵每一列求平均值,形成的64维向量作为初始类心,当然啦,N个向量都属于这一类心的簇,因为就这个类
2、将这个簇一分为二
在这个簇中随机生成两个类心,怎么个随机法呢?
找到矩阵每一列中最小值min_x,最大值max_x,再利用min_x+(max_x-min_x)*random.rand(k,1)计算出每一列的随机值,将这个64个数作为新的类心
毕竟是随机生成的,有的类心合适,有的不合适,如何判定这个类心生成的是否成功?
通过对SSE(Sum of Squared Error)的判断,即:对哪一个簇进行划分能够最大程度降低SSE,就划分哪个簇。
计算SSE_Split(这是对簇一分为二后的SSE)和SSE_NotSplit(这是对其他簇的SSE之和)相加,和上一次一分为二的SSE_Split+SSE_NotSplit相比较,如果小就这么划分
3、将簇分成两个簇
利用欧式距离公式计算每个图像的特征值与类心的距离,将图像特征值归类到距离小的那个类心
4、重复2、3步,直到类别数量达到用户的要求数量
5、利用欧式公式将每个图像的特征值归类到每个类
6、将图片路径、类、特征值写入txt中
用之前的方法计算图像的特征值,然后计算与那几个类心的距离,确定所属类别。计算它与相同类里的几组特征值的距离,然后排序返回路径
利用Gray=0.30*R+0.59*G+0.11*B计算出图像像素中最大的灰度值gray_max,然后设置一个规定的最大灰度值gray_level。如果gray_max>gray_level,则int(每个像素的灰度值*gray_level/gray_max),一定要加上int,因为接下来会把处理过的像素值当成坐标用,坐标必须是整数.如果gray_max<=gray_level,则不用修改灰度值。
根据图像中任意一点 (x,y)的灰度值和它所对应的点 (x+dx,y+dy)的灰度值可以得到一个灰度值组合 (g1,g2),然后初始化一个全为零的gray_level*gray_level的二维数组,在(g1,g2)加一。
四个方向是0,45,90,135度,也就(dx,dy)取值为(1,0),(0,1),(1,1),(-1,1)
把路径,特征值写到txt文件中
用欧式公式与txt文件里的每个图片的特征值计算,计算出最小的几个值并排序,返回他们的路径
Gray=0.30*R+0.59*G+0.11*B
, 其中
,p+q = 2,3......
以上几张图都是借用的,是在编辑的很累...原图在https://blog.csdn.net/purgle/article/details/50976268
然后将路径和特征值写入txt中
用欧式公式计算特征值和txt中的每个特征值,选出其中小的几个排序,并返回路径
——————————————————————————————————————————————————————————————————————————————
在windows环境中运行,因为需要读取txt文本,在open()某个txt文件的时候,添加encode='utf-8'编码方式
例如:open('基于内容的图像检索技术/color.txt','r', encoding='utf-8')
同时发现里面还有不严谨的地方,open()了文件,没有运行close()方法来关闭,所以建议修改一下,虽然不影响使用。
注意打开项目的位置,也是我自己当初不会用git导致多了一层目录
该项目识别正确率并不是很高,因为算法单一且简单,而且钟爱识别出大象,所以如果是为了配合老师检查的话,演示的时候最好是选择识别大象,这样会显得正确率偏高。
——————————————————————————————————————————————————————————————————————————————
下面的链接是本项目的代码,可直接食用,把本文开头的东西装好就行了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。