灰度共生矩阵VC++实现
图像灰度化方法总结及其VC实现

图像灰度化方法总结及其VC实现最近一段时间作者开始进行运动目标识别定位系统设计,本文以及后续的几篇文章都是从一个图像处理初学者的角度来总结目标检测定位过程中所应用到的各种常见的算法,尤其是解决算法实现过程中由于粗心大意或者C编程基本功不扎实所引起的各种问题。
本文主要对彩色图片灰度化的方法及其实现过程进行总结,最终给出实现的C代码。
在进行视频流目标识别与跟踪时,通常第一个步骤就是对采集到的彩色图像进行灰度化,这是因为黑白照片数据量小,相比彩照更易实现实时算法,另一方面黑白照片是由未处理的光线所形成的照片,因此从图像处理学角度来看,这种未经特殊滤光处理的图片所涵盖的信息更有价值。
目前,在图像处理过程中,最常用的彩色图片格式有RGB,HSV、YUV以及HLS三种。
以下分别对这三种格式的彩色图像进行灰度化实现。
1、RGB空间图像定义于RGB空间的彩色图,其每个像素点的色彩由R、G、B三个分量共同决定。
每个分量在内存所占的位数共同决定了图像深度,即每个像素点所占的字节数。
以常见的24深度彩色RGB图来说,其三个分量各占1个字节,这样每个分量可以取值为0~255,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。
对这样一幅彩色图来说,其对应的灰度图则是只有8位的图像深度(可认为它是RGB三个分量相等),这也说明了灰度图图像处理所需的计算量确实要少。
不过需要注意的是,虽然丢失了一些颜色等级,但是从整幅图像的整体和局部的色彩以及亮度等级分布特征来看,灰度图描述与彩色图的描述是一致的。
对于RGB图像进行灰度化,通俗点说就是对图像的RGB三个分量进行加权平均得到最终的灰度值。
最常见的加权方法如下:1)Gray=B;Gray=G;Gray=R2)Gray=max(B+G+R)3)Gray=(B+G+R)/34)Gray= 0.072169B+ 0.715160G+ 0.212671R5)Gray= 0.11B+ 0.59G+ 0.3R这三种方法中,第一种为分量法,即用RGB三个分量的某一个分量作为该点的灰度值;第二种方法为最大值法,将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。
opencvpython灰度共生矩阵纹理特征

灰度共生矩阵(GLCM)是一种常用的纹理特征提取方法,特别是在图像处理和计算机视觉领域。
它通过统计图像中像素对的灰度级信息来描述纹理特性。
在OpenCV的Python实现中,可以通过如下步骤来实现:1. 首先,你需要将彩色图像转化为灰度图像,可以使用`cv2.cvtColor()`函数。
2. 然后,你需要定义一个距离和角度参数。
这些参数将用于在图像中移动像素对。
3. 接下来,你需要定义一个函数来计算灰度共生矩阵。
这个函数将遍历图像中的所有像素对,并使用灰度共生矩阵的公式来计算每个像素对的灰度级信息。
4. 最后,你可以使用这个灰度共生矩阵来提取图像的纹理特征。
这些特征可能包括对比度、相关性、能量和熵等。
下面是一个简单的示例代码:```pythonimport cv2import numpy as np# 读取图像image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)# 定义距离和角度参数distance = 1angle = np.pi/4# 定义灰度共生矩阵函数def calculate_glcm(image, distance, angle):width, height = image.shapeglcm = np.zeros((256, 256))for x in range(0, width-distance):for y in range(0, height-distance):i = image[x][y]j = image[x+distance][y+distance]glcm[i][j] += 1return glcm/np.sum(glcm)# 计算灰度共生矩阵glcm = calculate_glcm(image, distance, angle)# 提取纹理特征contrast = np.sum(glcm[0:8, 0:8]) # 对比度特征correlation = np.sum(glcm*np.outer(np.arange(256), np.arange(256))) # 相关性特征energy = np.sum(glcm**2) # 能量特征entropy = -np.sum(glcm*np.log2(glcm+1e-10)) # 熵特征```请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体需求进行修改和优化。
基于灰度共生矩阵(GLCM)的图像纹理分析与提取

基于灰度共生矩阵(GLCM)的图像纹理分析与提取重磅干货,第一时间送达灰度共生矩阵灰度共生矩阵(Gray Level CO-Occurrence Matrix-GLCM)是图像特征分析与提取的重要方法之一,在纹理分析、特征分类、图像质量评价灯方面都有很重要的应用,其基本原理图示如下:左侧是一个图像,可以看出最小的灰度级别是1,最大的灰度级别是8,共有8个灰度级别。
右侧对应的灰度共生矩阵,左上角第一行与第一列的坐标(1, 1)包含值1,原因在于水平方向上,相距一个像素值,当前像素跟水平右侧相邻像素只有一个是1、1相邻的像素值(灰度级别)对;右侧共生矩阵的原始(1, 2) = 2 说明在像素矩阵中有两个像素值1,2相邻的像素点对、以此类推得到完整的右侧灰度共生矩阵。
根据当前像素跟相邻像素位置不同,可以计算得到不同的共生矩阵,同时根据像素之间的距离不同会输出不同灰度共生矩阵。
总结来说,有如下四种不同角度的灰度共生矩阵:•0度水平方向GLCM•45度方向GLCM•90度垂直方向GLCM•135度方向GLCM根据相邻像素点之间距离参数D不同可以得到不同距离的GLCM。
此外对正常的灰度图像来说,最小灰度值为0,最大的灰度值为255,共计256个灰度级别,所以GLCM的大小为256x256,但是我们可以对灰度级别进行降维操作,比如可以每8个灰度值表示一个level这样,这样原来256x256大小的共生矩阵就可以改成256/8 * 256 /8 = 32x32的共生矩阵。
所以最终影响灰度共生矩阵生成有三个关键参数:•角度 (支持0、45、90、135)•距离(大于等于1个像素单位)•灰度级别(最大GLCM=256 x 56)GLCM实现纹理特征计算灰度共生矩阵支持如下纹理特征计算,它们是:•能量•熵值•对比度•相关性•逆分差这些纹理特征计算公式如下:上述5个是常见的GLCM的纹理特征,GLCM总计由14个特征值输出,这里就不再赘述了!感兴趣的可以自己搜索关键字GLCM。
计算机视觉中的灰度共生矩阵算法研究

计算机视觉中的灰度共生矩阵算法研究随着计算机图像处理技术的不断发展,图像识别、分类和检测等任务在各种应用中都得到了广泛的应用。
在这些任务中,图像特征是一种非常重要的工具,特别是纹理特征。
因此,研究有效的纹理特征提取方法一直是计算机视觉领域的研究热点之一。
灰度共生矩阵算法是一种非常常用的纹理特征提取方法之一,它能够反映灰度级之间的空间关系。
灰度共生矩阵算法(Gabor)是一种基于图像的局部特征提取方法,通过计算灰度级之间的统计规律,可以有效地反映图像中的纹理信息。
灰度共生矩阵算法在图像分类、目标检测、人脸识别等领域应用广泛,同时它也是其他图像特征提取方法的基础。
灰度共生矩阵算法的核心思想是利用灰度级之间的空间关系来反映图像的纹理信息。
在灰度共生矩阵中,每一个像素与其邻居像素之间的灰度关系被用来表示纹理信息的某一个方面。
在计算灰度共生矩阵时,需要设置一定的距离和角度,来确定邻居像素之间的位置关系。
在一幅图像中,对于每一个像素,在其周围一定距离内的像素对于其灰度共生矩阵的计算是有影响的,因此这种方法可以有效地反映图像中的局部纹理特征。
灰度共生矩阵算法是一种很灵活的方法,可以根据需要对距离和角度进行调整以获取不同的纹理信息。
在灰度共生矩阵计算完成之后,可以通过计算不同的灰度共生矩阵参数来提取不同的纹理特征。
其中最常用的参数是对比度、能量、熵和相关度。
对比度反映了灰度共生矩阵中像素灰度级之间的变化程度,对于较细的纹理具有比较好的响应。
能量度量了灰度共生矩阵中像素出现概率的总和,对于较大的纹理具有比较好的响应。
熵可以表示灰度共生矩阵的不确定性或信息熵,对于纹理的复杂程度具有比较好的响应。
相关度用来描述灰度共生矩阵中像素间的相关性。
作为一种经典的纹理特征提取方法,灰度共生矩阵算法在图像处理领域有许多应用。
例如,在计算机视觉中,它可以用来进行目标检测、图像分类、人脸识别等任务。
另外,在医学图像处理等领域也可以使用灰度共生矩阵算法来提取纹理特征,从而识别图像中的组织结构和疾病等信息。
灰度共生矩阵法

灰度共生矩阵法1. 引言灰度共生矩阵法是一种用于图像分析和纹理特征提取的方法。
它通过计算图像中灰度级相邻像素之间的频次,用以描述图像的纹理特征。
本文将详细介绍灰度共生矩阵的原理、计算过程和应用领域。
2. 灰度共生矩阵的原理2.1 灰度共生矩阵介绍灰度共生矩阵(gray-level co-occurrence matrix,GLCM),又称共生矩阵或共生矩阵,是一种用于计算图像纹理特征的统计工具。
它描述了图像中相邻像素之间的灰度级关系,可以用来表征图像的纹理信息。
2.2 灰度共生矩阵的计算灰度共生矩阵的计算分为以下几个步骤: 1. 将原始图像转换为灰度图像。
2. 根据设定的像素间距(pixel distance)和方向(angle)参数,计算图像中每对相邻像素的灰度级对。
3. 统计每对灰度级对出现的频次,构建灰度共生矩阵。
3. 灰度共生矩阵的计算过程3.1 图像灰度化将彩色图像转换为灰度图像的常用方法有取平均灰度法、加权平均法和仅取一个分量法等。
选择合适的灰度化方法可以提取出图像中的纹理信息。
3.2 灰度共生矩阵的定义灰度共生矩阵是一个正方形矩阵,其大小为灰度级的个数。
矩阵的每个元素表示了某一对灰度级在特定方向上出现的频次。
3.3 灰度共生矩阵的计算对于给定的图像和参数,可以通过遍历图像的所有像素,并统计每对相邻像素的灰度级对出现的频次来计算灰度共生矩阵。
4. 灰度共生矩阵的应用领域4.1 纹理特征提取灰度共生矩阵能够提取图像的纹理特征,例如对比度、能量、协方差等。
这些特征可以用于图像分类、图像识别和图像检索等任务中。
4.2 图像分割灰度共生矩阵可以通过分析图像中的纹理信息,用于图像分割。
基于纹理的图像分割算法可以通过提取纹理特征,将图像分成不同的区域,有助于提高图像分割的准确性和效果。
4.3 缺陷检测灰度共生矩阵在材料缺陷检测中也有广泛应用。
通过提取纹理特征,可以对材料表面的缺陷进行分析和检测,有助于提高材料质量的控制。
灰度共生矩阵法

灰度共生矩阵法灰度共生矩阵法是一种常用的图像纹理特征分析方法,它通过统计图像中不同灰度值之间出现的空间关系来描述图像的纹理特征。
本文将从以下几个方面详细介绍灰度共生矩阵法。
一、灰度共生矩阵法的基本原理灰度共生矩阵法是一种基于灰度级别的统计方法,它通过计算同一图像区域内不同位置处两个像素之间的灰度值关系,得出各种方向上不同距离处两个像素之间某些特定关系的概率分布。
具体而言,对于给定的图像I(x,y),以及距离d和角度θ,可以定义一个二元组(x,y)和另一个二元组(x+d*cosθ,y+d*sinθ)之间的关系,通常称为共生对。
然后可以通过统计所有这些共生对在整个图像中出现的频率来生成一个称为灰度共生矩阵(GLCM)的矩阵。
二、灰度共生矩阵法的主要步骤1. 灰度化:将彩色图像转换为灰度图像。
2. 分块:将整幅图像分割成若干个小块,每个小块的大小可以根据实际需求来确定。
3. 计算灰度共生矩阵:对于每个小块,计算其灰度共生矩阵。
具体而言,对于每个像素点,统计它周围距离为d、方向为θ的所有像素点的灰度值,并将这些灰度值作为共生对出现的频率填入GLCM中。
4. 特征提取:从GLCM中提取出各种特征参数。
常用的特征参数包括能量、熵、对比度、相关性等。
5. 分类识别:将提取出来的特征参数输入到分类器中进行分类识别。
三、灰度共生矩阵法的常用特征参数1. 能量(Energy):能量是指GLCM中所有元素平方和的开方,它反映了图像纹理的粗细程度。
能量越大,表示图像纹理越粗糙。
2. 熵(Entropy):熵是指GLCM中所有元素对数之和的相反数,它反映了图像纹理的复杂程度。
熵越大,表示图像纹理越复杂。
3. 对比度(Contrast):对比度是指GLCM中元素值之差与元素位置之间距离的加权和,它反映了图像纹理的明暗程度。
对比度越大,表示图像纹理越明暗分明。
4. 相关性(Correlation):相关性是指GLCM中元素值之间的线性关系程度,它反映了图像纹理的方向性。
灰度共生矩阵纹理特征提取算法的优化与实现

纹理特征分析的灰度共生矩阵(GLCM)

纹理特征分析的灰度共生矩阵(GLCM)灰度共生矩阵(GLCM)是一种用于纹理特征分析的图像处理技术。
它广泛应用于各种领域,例如图像识别、图像分类、医学图像分析等。
GLCM通过统计图像中不同灰度级别的像素对出现的频次来描述图像的纹理特征。
GLCM是一个二维矩阵,它以图像中的像素值为输入,生成一个矩阵。
矩阵中的每个元素表示了两个像素具有一定距离(通常为1个像素)时,它们具有其中一种特定的灰度相对关系(如相等、相邻或对称等)的频次统计。
这个频次统计是通过扫描整个图像来进行计算的。
为了计算GLCM,我们需要遍历图像中的每个像素,对于每个像素,我们将与其距离为d的像素对应的GLCM矩阵元素+1、距离d是一个参数,用于确定计算GLCM时考虑的像素对的距离。
通常,我们将距离d设置为1,以考虑邻近像素之间的关系。
GLCM矩阵的大小与图像的灰度级数有关。
如果图像有N个灰度级别,则GLCM矩阵的大小为N×N。
矩阵中的每个元素(i,j)表示在图像中,像素值为i的像素和像素值为j的像素成对出现的频次。
这个频次可以用于计算一些统计特征,这些特征可以用来描述图像的纹理特征。
常用的灰度共生矩阵特征包括:1. 对比度(Contrast):对比度是通过计算矩阵中不同灰度级别像素对的频次差异来描述图像的纹理对比度。
2. 逆差矩(Inverse Difference Moment):逆差矩用于衡量图像的纹理细节程度,即描述图像中相邻不同灰度级别像素对的频次。
3. 相关度(Correlation):相关度用于衡量图像的纹理的线性依赖性,即描述图像中相邻像素的线性相关性。
4. 能量(Energy):能量用于衡量图像的纹理的均匀性,即描述图像中不同灰度级别像素对的频次的平方和。
5. 熵(Entropy):熵用于衡量图像的纹理的复杂性,即描述图像中不同灰度级别像素对的频次的信息熵。
这些特征可以用来描述图像的纹理特征,从而可以用于图像分类、识别等应用中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// GrayShow.cpp: implementation of the CGrayShow class. // 灰灰灰灰灰灰灰灰灰灰
//
//////////////////////////////////////////////////////////////////////
delete []PMatrixH; }
//135灰度度度度灰灰灰灰灰灰 //90灰度度度度灰灰灰灰灰灰
//////////////////////////////////////////////////////////////////// //功功:装装原原 //参原:FilePathName-原原图图图图图
//计灰ux double ux = 0.0; double localtotal = 0.0; for(i=0; i<dim; i++) {
localtotal = 0.0; for(j=0; j<dim; j++) {
localtotal += pdMatrix[i*dim+j]; } ux += (double)i * localtotal; }
{
int i,j;
double *pdMatrix;
pdMatrix = new double[dim*dim];
int total = 0; for(i=0; i<dim; i++) {
for(j=0; j<dim; j++) {
total += pMatrix[i*dim+j]; } }
for(i=0; i<dim; i++) {
//
FeatureCorrelation-相相
//
FeatureLocalCalm-局局局局
//
pMatrix-灰灰灰灰
//
dim-灰灰灰灰度共原
///////////////////////////////////////////////////////////////////////////////////
for(j=0; j<dim; j++) {
pdMatrix[i*dim + j] = (double)pMatrix[i*dim + j]/(double)total; } }
FeatureEnergy = 0.0; FeatureEntropy = 0.0;
2
FeatureInertiaQuadrature = 0.0; FeatureLocalCalm = 0.0;
//计灰sigmay double sigmay = 0.0; for(j=0; j<dim; j++) {
localtotal = 0.0; for(i=0; i<dim; i++) {
localtotal += pdMatrix[i*dim+j]; } sigmay += (double)(j-uy) * (double)(j-uy) * localtotal; }
//
m_tOriPixelArray[i][j].rgbReserved = 0;
//
m_tResPixelArray[i][j]=m_tOriPixelArray[i][j];
//
ImageArray[i][j] = (BYTE)(((unsigned int)m_tOriPixelArray[i][j].rgbBlue
//计灰相相 FeatureCorrelation = 0.0; for(i=0; i<dim; i++) {
for(j=0; j<dim; j++)
3
{ FeatureCorrelation += (double)(i-ux) * (double)(j-uy) * pdMatrix[i*dim+j];
// m_tResPixelArray = new RGBQUAD*[ImageHeight];
// ImageArray = new BYTE*[ImageHeight];
// for(int l=0 ; l<ImageHeight; l++)
// {
//
m_tOriPixelArray[l] = new RGBQUAD[ImageWidth];
#include "stdafx.h"
#include "GrayShow.h" #include "math.h"
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
//
{
//
delete m_tOriPixelArray[i];
1
//
delete m_tResPixelArray[i];
//
delete ImageArray[i];
//
}
// }
//
// m_dib->Open(FilePathName);
// ImageWidth = m_dib->GetWidth();
//
PMatrixV[i] = new int[GrayLayerNum];
// }
}
CGrayShow::~CGrayShow() {
if(PMatrixRD)
delete []PMatrixRD ; if(PMatrixLD)
delete []PMatrixLD ; if(PMatrixV)
delete []PMatrixV ; if(PMatrixH)
// for(i=0; i<GrayLayerNum; i++)
// {
//
PMatrixH[i] = new int[GrayLayerNum];
//
PMatrixLD[i]= new int[GrayLayerNum];
//
PMatrixRD[i]= new int[GrayLayerNum];
for(j=0; j<ImageWidth; j++)
//
{
//
m_tOriPixelArray[i][j].rgbBlue =colorTable[count++];
//
m_tOriPixelArray[i][j].rgbGreen=colorTable[count++];
//
m_tOriPixelArray[i][j].rgbRed =colorTable[count++];
FeatureEntropy -= pdMatrix[i*dim+j]*log(pdMatrix[i*dim+j]); }
//惯惯灰 FeatureInertiaQuadrature += (double)(i-j)*(double)(i-j)*pdMatrix[i*dim+j];
//局局局局 FeatureLocalCalm += pdMatrix[i*dim+j]/(1+(double)(i-j)*(double)(i-j)); } }
//m_tOriPixelArray = NULL;//原原原原原原 //m_tResPixelArray = NULL;//参参原原原原
// m_dib = new CDib();
distance = 5;
FilterWindowWidth = 16; GrayLayerNum = 16; //初原初初初8个灰灰个,可可可可 //这这灰灰灰灰这初GrayLayerNum×GrayLayerNum
// ImageHeight = m_dib->GetHeight();
//
// BYTE *colorTable;
// colorTable = (BYTE *)m_dib->m_pDibBits;
// int byteBitCount = m_dib->GetBiBitCount()/8;
//
// m_tOriPixelArray = new RGBQUAD*[ImageHeight];
// }
//}
////////////////////////////////////////////////////////////////////////////////////
//函原功功:计灰计计计计
//参原:FeatureEnergy-功能
//
FeatureEntropy-熵
//
Fea惯灰
// void CGrayShow::LoadImage(CString &FilePathName)
// {
//
// }
// {
// int i,j; // //检检检检初检,不初检不不不不不不
// if(m_tOriPixelArray !=NULL)
// {
//
for(i=0; i<ImageHeight; i++)
//计灰功能、熵、惯惯灰、局局局局 for(i=0; i<dim; i++) {
for(j=0; j<dim; j++) {