基于纹理特征的kmeas聚类的图像分割方案

Gabor滤波器简介

在图像处理中,以Dennis Gabor命名的Gabor滤波器是一种用于纹理分析的线性滤波器,本质上是指在分析点或分析区域周围的局部区域内,分析图像中是否存在特定方向的特定频率内容。Gabor滤波器的频率和方向表示被许多当代视觉科学家认为与人类视觉系统的频率和方向表示相似。它们被发现特别适合于纹理表征和辨别。

在空间域,二维Gabor滤波器是由正弦平面波调制的高斯核函数(见Gabor变换)。

定义

由于Gabor滤波器脉冲响应的乘法卷积性质(卷积定理),其傅里叶变换等于谐波函数(正弦函数)的傅里叶变换与高斯函数的傅里叶变换的卷积。滤波器有一个实分量和一个虚分量表示正交方向。这两个分量可以组成一个复数,也可以单独使用。

图像特征提取

一组不同频率和方向的Gabor滤波器可能有助于从图像中提取有用的特征。在离散域中,二维Gabor滤波器:

其中BC是待确定的归一化因子。
二维Gabor滤波器在图像处理中有着丰富的应用,特别是在纹理分析和分割的特征提取方面。f定义了在纹理中寻找的频率。通过改变theta,我们可以寻找面向特定方向的纹理。通过改变sigma,我们改变了支持或被分析图像区域的大小。

2-D Gabor滤波器在图像处理的应用

在图像处理中,Gabor特征是识别的理想选择。在文档图像处理中,Gabor特征是识别多语言文档中单词的脚本的理想选择由于文本具有丰富的高频成分,而图片本质上相对平滑,不同频率和不同方向的Gabor滤波器已被用于从复杂文档图像(包括灰色和彩色)中定位和提取纯文本区域。它还被应用于面部表情识别。Gabor滤波器在模式分析中也得到了广泛的应用。例如,它已被用于研究脊柱多孔海绵状小梁内的指向性分布。Gabor空间在光学字符识别、虹膜识别和指纹识别等图像处理应用中非常有用。特定空间位置的激活之间的关系在图像中的物体之间非常不同。此外,重要的激活可以从Gabor空间中提取,以创建一个稀疏的对象表示。

Gabor在python中的实现

1.	#构建Gabor滤波器  
2.	def build_filters(num_orientations=8):  
3.	    filters = []  
4.	    # 定义多个不同方向的Gabor滤波器参数  
5.	    ksize = [7, 9, 11, 13, 15, 17]  # 滤波器的大小  
6.	    sigma = 4.0  # 高斯函数的标准差  
7.	    lambd = 10.0  # 波长  
8.	    gamma = 0.5  # 高斯核的椭圆度  
9.	    # num_orientations = 8  # 设定多个不同方向的Gabor滤波器  
10.	  
11.	    for theta in np.linspace(0, np.pi, num_orientations, endpoint=False):  
12.	        for k in ksize:  
13.	            gabor_filter = cv2.getGaborKernel((k, k), sigma, theta, lambd, gamma, ktype=cv2.CV_32F)  
14.	            filters.append(gabor_filter)  
15.	  
16.	    #绘制滤波器  
17.	    plt.figure(1)  
18.	    for temp in range(len(filters)):  
19.	        plt.subplot(8, 6, temp + 1)  
20.	        plt.imshow(filters[temp])  
21.	    plt.show()  
22.	  
23.	    return filters  

上述代码构建了6个不同尺度下,8个不同方向上,共48个滤波核构成的的Gabor滤波器组,如下图所示

分别使用这48个滤波器组对图像(灰度)进行特征提取,并拼接成特征矩阵,代码如下: 

1.	#Gabor特征提取  
2.	def getGabor(img, filters):  
3.	    features_list = [] #滤波结果  
4.	    for filter in filters:  
5.	        # 对图像应用多个不同尺度不同方向的Gabor滤波器,并将特征合并为一个特征向量  
6.	        filtered_image = cv2.filter2D(img, cv2.CV_8UC1, filter)  
7.	        features = filtered_image.reshape(-1)  
8.	        features_list.append(features)  
9.	  
10.	    feature_matrix = np.array(features_list).T  
11.	    return feature_matrix  

该特征矩阵的维度为(H×W,48),即每个像素都有一个48维的特征向量,通过使用kmeans聚类算法计算这些特征向量的相似度,对每个像素进行4分类

1.	def kmeansSeg(feature_matrix, num_clusters):  
2.	    # 使用Kmeans进行聚类  
3.	    kmeans = KMeans(n_clusters=num_clusters, random_state=0)  
4.	    kmeans.fit(feature_matrix)  
5.	    # 获取聚类结果  
6.	    labels = kmeans.labels_  
7.	    return labels  

对得到的标签进行颜色映射,输出结果如下

可以看到,当聚类簇数为4时的分割效果是较好的,注意我们在gabor滤波器中只调整了不同的方向和尺度特征,因此得到的聚类效果也是对不同方向下的聚类效果

接下来我们来看在不同聚类簇数下的聚类效果

 可以看到,在不同聚类簇数下对纹理特征的聚类效果各不相同,其中当聚类簇数为4时效果较好

完整源码 

import cv2
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans


class GaborSegmention():
    def __init__(self,img,num_orientations = 8):#初始化滤波器
        self.img=img
        self.filters = []

        # 定义6个不同尺度和num_orientations个不同方向的Gabor滤波器参数
        ksize = [7, 9, 11, 13, 15, 17]  # 滤波器的大小
        sigma = 4.0  # 高斯函数的标准差
        lambd = 10.0  # 波长
        gamma = 0.5  # 高斯核的椭圆度
        # num_orientations = 8  # 设定多个不同方向的Gabor滤波器

        for theta in np.linspace(0, np.pi, num_orientations, endpoint=False):
            for k in ksize:
                gabor_filter = cv2.getGaborKernel((k, k), sigma, theta, lambd, gamma, ktype=cv2.CV_32F)
                self.filters.append(gabor_filter)

        # 绘制滤波器
        plt.figure(figsize=(12, 12))
        for i in range(len(self.filters)):
            plt.subplot(8, 6, i + 1)
            plt.imshow(self.filters[i])
            plt.axis('off')
        plt.show()

    def getGabor(self):
        feature_matrix=[]
        for filter in self.filters:
            # 对图像应用6个不同尺度8个不同方向的Gabor滤波器,得到一个h*w特征图
            filtered_image = cv2.filter2D(self.img, cv2.CV_8UC1, filter)
            # 一个特征图就表示某一个尺度下的某一个方向下的特征
            features = filtered_image.reshape(-1)
            feature_matrix.append(features)

        # 该结果表示每个像素的6个尺度8个方向Gabor特征向量
        feature_matrix = np.array(feature_matrix).T
        return feature_matrix
    def kmeansSeg(self,num_clusters,feature_matrix):
        # 使用Kmeans进行聚类,即计算每个像素的特征向量(48个特征)的相似度
        kmeans = KMeans(n_clusters=num_clusters, random_state=0)
        kmeans.fit(feature_matrix)
        # 获取聚类结果
        labels = kmeans.labels_
        return labels

    def colorMap(self, labels):
        # 进行像素映射
        color_map = np.array([[255, 0, 0],  # 蓝色
                              [0, 0, 255],  # 红色
                              [0, 255, 0],  # 绿色
                              [255, 255, 0],
                              [0, 255, 255],
                              [128, 128, 128]
                              ])
        # 将聚类结果转化为图像
        segmented_image = color_map[labels].reshape(self.img.shape[0], self.img.shape[1], 3).astype(np.uint8)
        return segmented_image


if __name__=="__main__":
    # 加载图像
    # image_path = r"./data/planets.jpg"
    image_path = r"./data/coins.jpg"
    img = cv2.imread(image_path)
    image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # print(image.shape)

    # 创建gaborSeg分割对象,初始化gabor滤波器
    gaborSeg=GaborSegmention(image)
    # 获取特征矩阵
    feature_matrix = gaborSeg.getGabor()

    # # 分割结果
    # labels=gaborSeg.kmeansSeg(num_clusters=4,feature_matrix=feature_matrix)
    # segmented_image=gaborSeg.colorMap(labels)
    num_clusters=[2,4,6]
    seglabels=[ gaborSeg.kmeansSeg(num_clusters=num_cluster,feature_matrix=feature_matrix)
                for num_cluster in num_clusters]

    segmented_images=[gaborSeg.colorMap(labels) for labels in seglabels]

    # 显示结果
    plt.figure(figsize=(16, 8))
    # 原图
    plt.subplot(221)
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    # 分割图
    for i,segmented_image in enumerate(segmented_images):
        plt.subplot(2,2,i+2)
        plt.imshow(segmented_image)
        plt.title("num_clusters={}".format(num_clusters[i]))
        plt.axis('off')

    # plt.subplots_adjust(hspace=0.2)
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/167292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊云科技帮助客户在云中构建具有高可靠性和韧性的应用程序

在一个理想的世界里,一切都非常完美,并且一直都在顺畅运作。早晨的通勤没有交通堵塞,最喜欢的停车位一直空着,一杯温度适宜的饮料,生活一帆风顺,没有任何中断。在需要时,您能得到所需的东西。但…

LeetCode207.课程表

看完题我就想,这不就是进程里面的死锁问题嘛,进程1等进程2释放锁,进程2等进程3释放锁,进程3等进程1释放锁,这就造成了死锁。或者是spring中的循环依赖问题,BeanA的初始化需要初始化一个BeanB,Be…

释放固态继电器的力量:主要优势和应用

固态继电器(SolidStateRelay,缩写SSR),是由微电子电路,分立电子器件,电力电子功率器件组成的无触点开关。用隔离器件实现了控制端与负载端的隔离。固态继电器的输入端用微小的控制信号,达到直接…

软件项目可行性研究报告

一、可行性研究报告 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2.可行性研究的前提 2.1要求 2.2目标 2.3条件、假定和限制 2.4可行性研究方法 2.5决定可行性的主要因素 3.对现有系统的分析 3.1处理流程和数据流程 3.2工作负荷 3.3费用…

俄罗斯操作系统Aurora OS 5.0全新UI亮相

俄罗斯媒体 IXBT 报道称,该地本土企业 Открытая мобильная платформа 于 2023 年 11 月 9 日至 10 日在圣彼得堡举行的 Mobius 2023 年秋季移动开发者专业会议上,展示了 Aurora OS 5.0 的界面和其他细节。 据介绍,…

美团外卖9元每周星期一开工外卖红包优惠券怎么领取?

美团外卖9元周一开工红包活动时间是什么时候? 美团外卖9元周一开工红包优惠券是指每周星期一可以领取的美团外卖红包优惠券,在美团外卖周一开工红包领取活动时间内可领取到9元周一开工美团外卖红包优惠券;(温馨提醒:如…

git 提交成了LFS格式,如何恢复

平常习惯使用sourceTree提交代码,某次打开时弹出了一个【是否要使用LFS提交】的确认弹窗,当时不知道LFS是什么就点了确认,后续提交时代码全变成了这个样子 因为是初始化的项目首次提交,将近四百个文件全被格式化成了这个样子&…

UASRT(2)

UASRT参数配置 数据发送过程 1.双缓冲 当要发送三个数据 且是连续发送 第一个数据写入TDR寄存器 然后到移位寄存器发送(一个一个bit的发送)在第一个数据在移位寄存器发送的时候第二个数据就已经被写入TDR寄存器了等到第一个数据发送完第二个数据就进入…

2023年中国位置服务(LBS)产业链及市场规模分析[图]

卫星导航系统的高技术、高成本、高效益属性使其成为国家经济实力与科技实力的标志之一。卫星导航系统由空间段、地面段和用户段三个部分组成,已广泛用于交通运输、农林牧渔、航空航海等领域,服务载体包括手机、汽车、无人机、导弹等,对人们生…

Docker基础知识总结

文章目录 1.Docker介绍2.Docker版本3.为什么要使用Docker4.Docker基础组件4.1 镜像(Images)4.2 容器(Container)和仓库(Repository) 5.Docker安装6.Docker run7.Dockerfile8.Docker commit9.镜像发布到镜像…

深度学习之基于CT影像图像分割检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于CT影像的图像分割检测系统可以被设计成能够自动地检测出CT图像中的病变部位或解剖结构,以协助医生进…

[一周AI简讯]OpenAI宫斗;微软Bing Chat更名Copilot;Youtube测试音乐AI

OpenAI宫斗,奥特曼被解雇,董事会内讧 Sam Altman被解雇,不再担任CEO,董事会的理由是奥特曼在与董事会的沟通中始终不坦诚,阻碍了董事会履行职责的能力。原首席技术官Mira Murati担任新CEO。OpenAI宫斗剧远未结束&…

Python的requests库:解决文档缺失问题的策略与实践

在Python的requests库中,有一个名为ALL_PROXY的参数,但是该参数的文档并未进行详细的描述。这使得用户在使用该参数时可能会遇到一些问题,例如不知道如何正确地配置和使用该参数。 解决方案 针对这个问题,我们可以采取以下几种解…

[Kettle] 生成记录

在数据统计中,往往要生成固定行数和列数的记录,用于存放统计总数 需求:为方便记录1~12月份商品的销售总额,需要通过生成记录,生成一个月销售总额的数据表,包括商品名称和销售总额两个字段,记录…

深度学习之基于YoloV5-Pose的人体姿态检测可视化系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 深度学习之基于 YOLOv5-Pose 的人体姿态检测可视化系统介绍YOLOv5-Pose 简介系统特点系统架构使用方法 二、功能三、系统四. 总结 一项目简介 深度学习之基…

金融市场数据至上:QuestDB 为您的数据提供最优解 | 开源日报 No.81

vlang/v Stars: 34.7k License: MIT V 是一个开源项目,它是一种简单、易于学习的编程语言。该项目具有以下核心优势和主要功能: 简洁性:可以在周末内掌握这门语言。快速编译:使用 Clang 后端约为 110k loc/s,本地和…

【grafana | clickhouse】实现展示多折线图

说明: 采用的是 Visualizations 的 Time series,使用的 clickhouse 数据源 在工作中遇到了一个需求,写好了代码,需要在grafana上展示在一个项目中所有人的,随时间的代码提交量变化图 目前遇到的问题:展示…

jetbrains ai 提示该地区不可用的百分百解决方案,亲测有效

问题 申请 jetbrains 的 ai assistant 白名单已经通过,但是在使用 ai assistant 的过程中提示 The usage of the service is not permitted in your location ,我所在的地区是中国,目前该插件是对中国大陆关闭的。 刚开始我怀疑是代理的问题&#xff…

2023年中国负极材料分类、产量及市场规模分析[图]

锂离子电池主要由正极、负极、隔膜、电解液、电池外壳组成。负极材料是锂离子电池的重要原材料之一,对于锂离子电池起关键作用。在充电过程负极材料中不断地与锂离子发生反应,将锂离子“擒获并存储”起来,亦将外部的功以能量的形式存储在电池…

1688API接口接入|阿里1688-B类电商基础链路专业化体验升级

新挑战,新契机! 当下整个互联网的竞争环境的变化为我们带来新的机遇和挑战。1688作为连接中小生产商、贸易商和零售商的源头货源首选平台,持续不断地为B类买家提供更专业的服务和更优质的源头厂货供给,打造核心竞争力。 面对新的…
最新文章