当前位置:文档之家› 灰度共生矩阵算法

灰度共生矩阵算法

图像理解与分析中灰度共生矩阵算法1作者:冰封蓝羽 2006-04-11 16:49:54标签:图像理解与分析中灰度共生矩阵算法周一早上图像理解与分析课上,朱启疆老师讲了灰度共生矩阵算法,回去后我编程实现了这个算法。

内容如下:共有matrix.cpp d_matrix.h d_exept.h mat.txt四个文件//matrix.cpp/*Visual C++ 6.0matrixdesigned by bfly*/#include <iostream>#include <fstream>#include <cstdlib>#include <cmath>#include <vector>#include "d_matrix.h"template <typename T>void outputmat(const matrix<T>& mat);template <typename T>int classifymat(const matrix<T>& mat);template <typename T>void transformmat(const matrix<T>& formermat, matrix<T>& lattermat);template <typename T>void probablitymat(const matrix<T>& mat,matrix<T>& probmat);template <typename T>void typicalarguement(const matrix<T>& mat,const matrix<T>& probmat); using namespace std;int main(){//input matrixmatrix<float> initMat;int numRows, numCols;int i, j;ifstream fin("mat.txt");if(!fin){cerr << "Cannot open 'mat.txt'" << endl;exit(1);}fin >> numRows >> numCols;initMat.resize(numRows, numCols);for(i = 0; i < numRows; i++){for(j = 0; j < numCols; j++){fin >> initMat[i][j];}}//transform matrix to tempMatint counter=classifymat(initMat);matrix<float> tempMat;tempMat.resize(counter, counter);transformmat(initMat, tempMat);outputmat(tempMat);//transform matrix to probMatmatrix<float> probMat;probMat.resize(counter, counter);probablitymat(tempMat, probMat);outputmat(probMat);cout << endl;//output the typicalarguementstypicalarguement(tempMat, probMat);return 0;}//outputmat matrix functriontemplate <typename T>void outputmat(const matrix<T>& mat){int i, j;for(i = 0; i < mat.rows(); i++){for(j = 0; j < mat.cols(); j++){cout << mat[i][j] << " ";}cout << endl;}}//classifymat matrix functiontemplate <typename T>int classifymat(const matrix<T>& mat){vector<T> memoryval;memoryval.push_back(mat[0][0]);int counter=1;bool flag = false;int i, j;for(i = 0; i < mat.rows(); i++){for(j = 0; j < mat.cols(); j++){for(int m = 0; m < memoryval.size(); m++) {if(mat[i][j] == memoryval[m])flag = true;}if(!flag){memoryval.push_back(mat[i][j]);counter++;}flag = false;}}return counter;}//transformmat matrix functiontemplate <typename T>void transformmat(const matrix<T>& formermat, matrix<T>& lattermat) {cout << "Plesase enter a and b: ";int a, b;int matval = 0;cin >> a >> b;int i, j, m, n;for(i = 0; i < lattermat.rows(); i++){for(j = 0; j < lattermat.cols(); j++){for(m = 0; m < formermat.rows(); m++){for(n = 0; n < formermat.cols(); n++){if(formermat[m][n]==i){if(((m+a) < formermat.rows()) && ((n+b) < formermat.cols())) {if(formermat[m+a][n+b] == j){matval++;}}}}}lattermat[i][j]=matval;matval=0;}}}//probablitymat matrix functiontemplate <typename T>void probablitymat(const matrix<T>& mat,matrix<T>& probmat){T sum = T();int i, j;for(i = 0; i < mat.rows(); i++)for(j = 0; j < mat.cols(); j++){sum += mat[i][j];}}for(i = 0; i < mat.rows(); i++){for(j = 0; j < mat.cols(); j++){probmat[i][j] = mat[i][j]/sum;}cout << endl;}}//typicalarguementstemplate <typename T>void typicalarguement(const matrix<T>& mat,const matrix<T>& probmat){T e = T(), H = T(), C = T(),I = T(), mean = T(), stdvar = T(), sum = T(), var = T();T M = T();int i, j;//typicalargument efor(i = 0; i < probmat.rows(); i++){for(j = 0; j < probmat.cols(); j++){e += probmat[i][j]*probmat[i][j];}}//typicalargument Hfor(i = 0; i < probmat.rows(); i++){for(j = 0; j < probmat.cols(); j++){H += probmat[i][j]*log(probmat[i][j])/log(10.0);}}H = -H;//typicalargument sumfor(i = 0; i < mat.rows(); i++)for(j = 0; j < mat.cols(); j++){sum += mat[i][j];}}//typicalargument meanmean = sum/(mat.rows()*mat.cols());//typicalargument varfor(i = 0; i < mat.rows(); i++){for(j = 0; j < mat.cols(); j++){var += (mat[i][j]-mean)*(mat[i][j]-mean);}}//typicalargument stdvarstdvar=sqrt(var);//typicalargument Cfor(i = 0; i < probmat.rows(); i++){for(j = 0; j < probmat.cols(); j++){C += (i - mean)*(j - mean)*probmat[i][j];}}C /= (stdvar*stdvar);//typicalargument Mfor(i = 0; i < probmat.rows(); i++){for(j = 0; j < probmat.cols(); j++){M += (probmat[i][j]/ (1 + (i - j)*(i - j))); }}//typicalargument Ifor(i = 0; i < probmat.rows(); i++){for(j = 0; j < probmat.cols(); j++){I += (i - j)*(i -j)*probmat[i][j];}}//output typicalargumentscout<<" 能量e = "<< e <<endl;cout<<" 熵H = "<< H <<endl;cout<<" 相关性C = "<< C <<endl;cout<<" 局部均匀性M = "<< M <<endl; cout<<" 惯性I = "<< I <<endl;}indexRangeError(const string& msg, int i, int size):baseException(){char indexString[80];ostrstream indexErr(indexString, 80);indexErr << msg << " index " << i << " size = " << size << ends; // indexRangeError can modify msgString, since it is in// the protected section of baseExceptionmsgString = indexString;}};// attempt to erase from an empty containerclass underflowError: public baseException{public:underflowError(const string& msg = ""):baseException(msg){}};// attempt to insert into a full containerclass overflowError: public baseException{public:overflowError(const string& msg = ""):baseException(msg){}};// error in expression evaluationclass expressionError: public baseException{public:expressionError(const string& msg = ""):baseException(msg){}};// bad object referenceclass referenceError: public baseException{public:referenceError(const string& msg = ""):baseException(msg){}};// feature not implementedclass notImplementedError: public baseException{public:notImplementedError(const string& msg = ""):baseException(msg){}};// date errorsclass dateError: public baseException{public:dateError(const string& first, int v, const string& last): baseException(){char dateStr[80];ostrstream dateErr(dateStr, 80);dateErr << first << ' ' << v << ' ' << last << ends;// dateError can modify msgString, since it is in// the protected section of baseExceptionmsgString = dateStr;}};// error in graph classclass graphError: public baseException{public:graphError(const string& msg = ""):baseException(msg){}};// file open errorclass fileOpenError: public baseException{public:fileOpenError(const string& fname):baseException()。

相关主题