当前位置:   article > 正文

基于内容的图像检索——颜色、形状、纹理三种方式实现_基于颜色和空间特征的图像检索代码

基于颜色和空间特征的图像检索代码

先上几张图,项目代码在最下面,可直接食用

GUI 用的是python的EasyGui

安装方法(我用的是ubuntu18.04系统)

sudo apt-get install python3-easygui

EasyGui使用方法: https://www.cnblogs.com/fuqia/p/8992438.html

一、基于颜色的图像检索——二分K-means

1、提取特征值

        每个像素的颜色由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 的矩阵来表示:

2、二分K-means

不同于普通的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中

3、计算要找查图片的特征值 

      用之前的方法计算图像的特征值,然后计算与那几个类心的距离,确定所属类别。计算它与相同类里的几组特征值的距离,然后排序返回路径

4、根据路径显示图片

二、基于纹理的图像检索——灰度共生矩阵

1、计算最大灰度值(然后缩小灰度值范围)

       利用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,则不用修改灰度值。

2、计算每个图片某个方向上的(一共四个方向)的P值

     根据图像中任意一点 (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)

3、每个灰度共生矩阵的纹理一致性,纹理对比度,纹理熵,纹理相关性

REL=ij(iμx)(jμy)Pij/(σxσy)

把路径,特征值写到txt文件中

4、计算要查找的图片的特征值

用欧式公式与txt文件里的每个图片的特征值计算,计算出最小的几个值并排序,返回他们的路径

5、根据路径显示图片

三、基于形状的图像检索——形状不变矩

1、计算图像像素的灰度值

Gray=0.30*R+0.59*G+0.11*B

2、计算笛卡尔系几何矩

3、计算中心矩阵

4、中心矩进行归一化

, 其中,p+q = 2,3......

5、计算7个不变矩

以上几张图都是借用的,是在编辑的很累...原图在https://blog.csdn.net/purgle/article/details/50976268

然后将路径和特征值写入txt中

6、对要搜寻的图片计算特征值

用欧式公式计算特征值和txt中的每个特征值,选出其中小的几个排序,并返回路径

7、根据路径显示图片

 

——————————————————————————————————————————————————————————————————————————————

2020/12/15更新

在windows环境中运行,因为需要读取txt文本,在open()某个txt文件的时候,添加encode='utf-8'编码方式

例如:open('基于内容的图像检索技术/color.txt','r', encoding='utf-8')

同时发现里面还有不严谨的地方,open()了文件,没有运行close()方法来关闭,所以建议修改一下,虽然不影响使用。

 

2021/2/13更新

注意打开项目的位置,也是我自己当初不会用git导致多了一层目录

该项目识别正确率并不是很高,因为算法单一且简单,而且钟爱识别出大象,所以如果是为了配合老师检查的话,演示的时候最好是选择识别大象,这样会显得正确率偏高。

——————————————————————————————————————————————————————————————————————————————

下面的链接是本项目的代码,可直接食用,把本文开头的东西装好就行了

https://download.csdn.net/download/qq_42520962/11338421

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/283483
推荐阅读
相关标签
  

闽ICP备14008679号