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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)