📄 radontransformer.cpp
字号:
// radontransformer.cpp: implementation of the RadonTransformer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RadonTransformer.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
RadonTransformer::RadonTransformer()
{
int theta;
for (theta=0;theta<180;theta++)
{
this->m_nCos[theta]=cos(theta);
this->m_nSin[theta]=sin(theta);
}
}
RadonTransformer::~RadonTransformer()
{
}
bool RadonTransformer::DoTransform(IplImage* image, RadonMap* rMap)
{
int i, total;
int x, y;
int theta, distance;
int cenX, cenY;
if (image->depth!=IPL_DEPTH_8U||image->nChannels!=1)
return false;
this->m_nWidth=image->width;
this->m_nHeight=image->height;
cenX=this->m_nWidth/2;
cenY=this->m_nHeight/2;
this->m_nDistSqrMax=((image->width+1)/2)*((image->width+1)/2)+
((image->height+1)/2)*((image->height+1)/2);
this->m_nDistanceMax=int (sqrt(this->m_nDistSqrMax)+0.5);
this->m_nDistSqrMax=this->m_nDistSqrMax/(RADON_DISTANCE_MAX*RADON_DISTANCE_MAX);
for (x=0; x<this->m_nWidth; x++)
{
for (y=0; y<this->m_nHeight; y++)
{
if (0==image->imageData[y*image->widthStep+x])
continue;
for (theta=0; theta<RADON_THETA_MAX; theta++)
{
distance=(int)
((double)(x-cenX)*this->m_nCos[theta]+(double)(y-cenY)*this->m_nSin[theta]+this->m_nDistanceMax);
distance*=RADON_DISTANCE_MAX;
i=distance/(this->m_nDistanceMax+this->m_nDistanceMax);
if (i<0)
{
i++;i--;
}
if (i>=RADON_DISTANCE_MAX)
{
i++;i--;
}
rMap->m_nMap[theta*RADON_DISTANCE_MAX+i]+=255;
}
}
}
total=RADON_DISTANCE_MAX*RADON_THETA_MAX;
for (i=0; i<total; i++)
{
rMap->m_nMap[i]/=this->m_nDistSqrMax;
if (rMap->m_nMap[i]>rMap->m_nMax)
rMap->m_nMax=rMap->m_nMap[i];
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -