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

news2024/11/17 23:46:41

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.coloradmin.cn/o/1235129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美国国家安全实验室员工详细数据在网上泄露

一个从事出于政治动机的攻击的网络犯罪组织破坏了爱达荷国家实验室(INL)的人力资源应用程序,该组织周日在电报上发帖称,已获得该核研究实验室员工的详细信息。 黑客组织 SiegedSec 表示,它已经访问了“数十万用户、员…

【LeetCode刷题-数组】--18.四数之和

18.四数之和 方法&#xff1a;排序双指针 先对数组进行排序&#xff0c;使用两重循环分别枚举前两个数&#xff0c;然后在两重循环枚举到的数之后使用双指针枚举剩下的两个数 class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List…

8051指令系统

目录 数据传送指令 算术运算指令 位操作类指令 某些指令的说明 截图来自&#xff1a; 第三章.8051指令系统&#xff08;1&#xff09;_哔哩哔哩_bilibili 数据传送指令 算术运算指令 位操作类指令 某些指令的说明

ChatGPT暂时停止开通plus,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止plus的注…

09【保姆级】-GO语言的数组和切片

09【保姆级】-GO语言的数组 一、数组1.1 数组定义1.2 数组的使用1.3 数组的遍历1.4 数组的应用案例 二、切片2.1 切片的介绍2.2 切片的原理2.3 切片的三种使用 之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&a…

基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码

基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于白冠鸡优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

白银投资的升值空间及未来趋势

在投资多样化的今天&#xff0c;人们可选择的投资产品也越来越多。白银作为具有较高价值的贵金属&#xff0c;一直以来便是仅次于黄金的贵金属投资品种&#xff0c;今年来也受到更多投资者的关注。那么白银的升值空间及未来趋势如何&#xff1f;是否值得投资&#xff1f;这边将…

原来 TinyVue 组件库跨框架(Vue2、Vue3、React、Solid)是这样实现的?

本文由 TinyVue 组件库核心成员郑志超分享&#xff0c;首先分享了实现跨框架组件库的必要性&#xff0c;同时通过演示Demo和实际操作向我们介绍了如何实现一个跨框架的组件库。 前言 前端组件库跨框架是什么&#xff1f; 前端组件库跨框架是指在不同的前端框架&#xff08;如…

Keka v1.3.5(mac压缩解压工具)

Keka是一款功能强大的文件压缩和解压缩软件&#xff0c;为Mac系统用户提供便捷、高效的文件管理工具。以下是Keka的主要特点和功能&#xff1a; 多种压缩格式支持&#xff1a;Keka支持多种常见的压缩格式&#xff0c;包括ZIP、7Z、RAR、TAR、GZIP等。它能够方便地创建和提取这些…

从Hugging Face上手动下载并加载预训练模型

0. 说明&#xff1a; 从 Hugging Face 上下手动载预训练的蛋白质语言模型&#xff08;以ProstT5为例&#xff09;&#xff0c;用模型中的 encoder 部分对蛋白质进行编码&#xff0c;得到 embedding features&#xff0c;用于下游的任务。 【ps. 除了手动下载之外&#xff0c;…

趣学python编程(七、实现个小网站如此简单 web.py使用介绍)

这里先拿一个小网站的例子来举例&#xff0c;保持好奇心就可以了。因为兴趣才是最好的老师&#xff0c;它能激发人内在的行动力。这里介绍个使用web.py轻量级框架实现的一个小网站&#xff0c;可以看到实现个小网站并不难。python都能用来干什么&#xff1f;那么网站就是它众多…

2023感恩节倒计时:跨境卖家如何借势风潮,成功脱颖而出?

感恩节&#xff0c;是西方世界最为重要的家庭聚会时刻之一&#xff0c;也是全球购物狂欢的开端。对于跨境电商卖家而言&#xff0c;这一时刻既是挑战&#xff0c;更是机遇。在感恩节大促倒计时的紧张氛围中&#xff0c;如何让自己的产品在激烈的市场竞争中脱颖而出&#xff0c;…

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…

Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)

Mybatis Plus分页实现逻辑整理&#xff08;结合芋道整合进行解析&#xff09; 我希望如春天般的你&#xff0c;身着白色的婚纱&#xff0c;向我奔赴而来&#xff0c;我愿意用全世界最温情的目光&#xff0c;朝着你的方向望去——姗姗来迟。 1.背景介绍 https://baomidou.com/p…

多目标应用:基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度(MATLAB代码)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标粒子群优化算法MOPSO 多目标粒子群优化算法MOPSO简介&#xff1a; 三、多目标粒子群优化算法MOPSO求解微电网多目标优化调度 &#xff08;1&…

selenium下载安装对应的chromedriver并执行

文章目录 selenium对应版本chrome驱动下载114以及之前的chrome版本119/120/121的chrome版本 chromedriver安装执行selenium代码 selenium Selenium是广泛使用的模拟浏览器运行的库&#xff0c;它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中&#xff0c…

小白也能看懂的国内外 AI 芯片概述

随着越来越多的企业将人工智能应用于其产品&#xff0c;AI芯片需求快速增长&#xff0c;市场规模增长显著。因此&#xff0c;本文主要针对目前市场上的AI芯片厂商及其产品进行简要概述。 简介 AI芯片也被称为AI加速器或计算卡&#xff0c;从广义上讲只要能够运行人工智能算法…

互联网医院源码搭建部署功能

互联网将医院与患者、医院内部&#xff08;医生、护士、领导层&#xff09;、医院与生态链上的各类组织机构连接起来。以患者为中心&#xff0c;优化医院业务流程&#xff0c;提升医疗服务质量与医院资源能效&#xff0c;让患者通过移动互联网随时随地的享受医院的服务&#xf…

我在CSDN开组会1-蒙特卡洛模拟在矿床学的应用展望

各位老师、同学们&#xff0c;大家好。今天组会的内容是蒙特卡洛模拟在矿床学的应用展望。 为什么要讲蒙特卡洛模拟呢&#xff0c;因为我发现在地质学方面已经有不少应用&#xff0c;但是蒙特卡洛模拟延伸的知识太晦涩了&#xff0c;劝退了很多探究者们。因此&#xff0c;计划…

多模态大模型训练数据集汇总介绍

RefCOCO、RefCOCO、RefCOCOg 这三个是从MS-COCO中选取图像得到的数据集&#xff0c;数据集中对所有的 phrase 都有 bbox 的标注。 RefCOCO 共有19,994幅图像&#xff0c;包含142,209个引用表达式&#xff0c;包含50,000个对象实例。RefCOCO 共有19,992幅图像&#xff0c;包含1…