图像 灰度共生矩阵怎么在matlab中实现,要具体源程序

图像 灰度共生矩阵怎么在matlab中实现,要具体源程序,第1张

matlab提供了现成的函数

graycomatrix生成共生矩阵

graycoprops计算其特征值

具体用法:

glcm = graycomatrix(I)

从图像I创建灰度共生矩阵glcm。通过计算具有灰度级i和灰度级j的像素对在水平方向相邻出现的频繁程度。glcm中的每个元素说明了水平方向相邻像素对出现的次数。如果灰度级为L则glcm的维数为L*L。

2.glcms = graycomatrix(I,param1,val1,param2,val2,...)

根据参数对的设定,返回一个或多个灰度共生矩阵。

参数说明:

'GrayLimits':灰度界限,为二元向量[low high]。灰度值小于等于low 时对应1,大于等于high时对应于灰度级。如果参数设为[],则共生矩阵使用图像的最小和最大灰度值作为界限,即[min(I(:)) max(I(:))]。

'NumLevels':整数,说明I中进行灰度缩放的灰度级数目。例如,如果NumLevel设为8,则共生矩阵缩放I中的灰度值使它们为1到8之间的整数。灰度级的数目决定了共生矩阵glcm的尺寸。缺省情况:数字图像:8;二进制图像:2。

'Offset':p行2列整型矩阵,说明感兴趣像素与其相邻像素之间的距离。每行是一个说明像素对之间偏移关系的二元向量[row_offset, col_offset]。行偏移row_offset是感兴趣像素和其相邻像素之间的间隔行数。列偏移同理。偏移常表达为一个角度,常用的角度如下:(其中D为像素距离)

角度 0 45 90 135

Offset [0,D] [-D D] [-D 0] [-D -D]

3.[glcms,SI] = graycomatrix(...)

返回缩放图像SI,SI是用来计算灰度共生矩阵的。SI中的元素值介于1和灰度级数目之间。

graycoprops:得到灰度共生矩阵得到各种属性

stats = graycoprops(glcm, properties):从灰度共生矩阵glcm计算静态属性。glcm是m*n*p的有效灰度共生矩阵。如果glcm是一个灰度共生矩阵的矩阵,则stats是包括每个灰度共生矩阵静态属性的矩阵。

graycoprops正规化了灰度共生矩阵,因此元素之和为1。正规化的GLCM中的元素(r,c)是具有灰度级r和c的定义的空间关系的像素对的联合概率。Graycoprops使用正规化的GLCM来计算属性。

属性参数如下:

1. 'Contrast' : 对比度。返回整幅图像中像素和它相邻像素之间的亮度反差。取值范围:[0,(GLCM行数-1)^2]。灰度一致的图像,对比度为0。

2. 'Correlation' : 相关。返回整幅图像中像素与其相邻像素是如何相关的度量值。取值范围:[-1,1]。灰度一致的图像,相关性为NaN。

3. 'Energy' : 能量。返回GLCM中元素的平方和。取值范围:[0 1]。灰度一致的图像能量为1。

4. 'Homogemeity' : 同质性。返回度量GLCM中元素的分布到对角线紧密程度。取值范围:[0 1]。对角矩阵的同质性为1。

void CTestSaveBmpView::SaveAsBmp(CString filename)

{

//定义图形大小

int iWidth = 800

int iHeight = 600

int iPixel = 16

//图形格式参数

LPBITMAPINFO lpbmih = new BITMAPINFO

lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER)

lpbmih->bmiHeader.biWidth = iWidth

lpbmih->bmiHeader.biHeight = iHeight

lpbmih->bmiHeader.biPlanes = 1

lpbmih->bmiHeader.biBitCount = iPixel

lpbmih->bmiHeader.biCompression = BI_RGB

lpbmih->bmiHeader.biSizeImage = 0

lpbmih->bmiHeader.biXPelsPerMeter = 0

lpbmih->bmiHeader.biYPelsPerMeter = 0

lpbmih->bmiHeader.biClrUsed = 0

lpbmih->bmiHeader.biClrImportant = 0

//创建位图数据

HDC hdc,hdcMem

HBITMAP hBitMap = NULL

CBitmap *pBitMap = NULL

CDC *pMemDC = NULL

BYTE *pBits

hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL)

hdcMem = CreateCompatibleDC(hdc)

hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0)

pBitMap = new CBitmap

pBitMap->Attach(hBitMap)

pMemDC = new CDC

pMemDC->Attach(hdcMem)

pMemDC->SelectObject(pBitMap)

//

CRect rc(0,0,iWidth,iHeight)

pMemDC->SetBkMode(TRANSPARENT)

//添加自绘图形

DrawCurve(pMemDC,rc)

//保存到文件并创建位图结构

BITMAPFILEHEADER bmfh

ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER))

*((char *)&bmfh.bfType) = ""B""

*(((char *)&bmfh.bfType) + 1) = ""M""

bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8

TCHAR szBMPFileName[128]

int iBMPBytes = iWidth * iHeight * iPixel / 8

strcpy(szBMPFileName,filename)

CFile file

if(file.Open(szBMPFileName,Cfile::modeWrite | Cfile::modeCreate))

{

file.Write(&bmfh,sizeof(BITMAPFILEHEADER))

file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER))

file.Write(pBits,iBMPBytes)

file.Close()

}

pMemDC->DeleteDC()

delete pMemDCpMemDC = NULL

delete pBitMappBitMap = NULL

delete lpbmihlpbmih = NULL

}

//输出文本和图形

void CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)

{

//页面背景色

CBrush brushCtl

brushCtl.CreateSolidBrush(RGB(255,255,255))

pDC->Rectangle(rcClient)

pDC->FillRect(rcClient,&brushCtl)

brushCtl.DeleteObject()

CPen pen

pen.CreatePen(PS_SOLID, 1, RGB(255,0,0))

CPen *oldPen = pDC->SelectObject(&pen)

double xMin = 10.00f, xMax = 100.00f

double yMin = 10.00f, yMax = 200.00f

double dbX1 = (xMax- xMin)/100 + xMin

double dbY1 = 600/dbX1

for (int i=1i<100i++) //曲线

{

double dbX2 = (xMax- xMin)*i/100 + xMin

double dbY2 = 600/dbX2

pDC->MoveTo(int(rcClient.left+(dbX1 - xMin)*rcClient.Width()/(xMax- xMin)),

int(rcClient.bottom-(dbY1- yMin)*rcClient.Height()/(yMax- yMin)))

pDC->LineTo(int(rcClient.left+(dbX2 - xMin)*rcClient.Width()/(xMax- xMin)),

int(rcClient.bottom-(dbY2- yMin)*rcClient.Height()/(yMax- yMin)))

dbX1=dbX2

dbY1=dbY2

}

pDC->SelectObject(oldPen)

pen.DeleteObject()

oldPen = NULL

}

//保存的实现

void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)

{

CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL)

if (dlg.DoModal()!= IDOK) return

CString filename = dlg.GetFileName() + ".bmp"

SaveAsBmp(filename)

CView::OnRButtonDown(nFlags, point)

}

有小错啊,才5个子图,你循环8次,还有subplot写错了;

解释一下:

a矩阵可以理解成三维的矩阵,第一维是组成该矩阵的二维矩阵的序号,第二维和第三维是矩阵的行和列;这里的a可以看成5个64*64的矩阵合成的;a(1,:,:)=zeros(64)表示a矩阵的第一联的所有行所有列为全0;

subplot是在一个画布里画子图,subplot(1,5,i)意思是将画布分成1行5列(5块),在第i块上作图;

image就是画图了:

a(1,:,:)=zeros(64)

a(2,:,:)=eye(64)

a(3,:,:)=rand(64)

a(4,:,:)=randn(64)

a(5,:,:)=hilb(64)

for i=1:5

subplot(1,5,i)

b=a(i)

image(b*255)

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8104368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存