📄 cellview.cpp
字号:
tempg += multi * got->g;
tempb += multi * got->b;
}
got = GetBit(x + 1, y);
if(got)
{
multi = SobelTemplateGy[5];
tempr += multi * got->r;
tempg += multi * got->g;
tempb += multi * got->b;
}
got = GetBit(x - 1, y + 1);
if(got)
{
multi = SobelTemplateGy[6];
tempr += multi * got->r;
tempg += multi * got->g;
tempb += multi * got->b;
}
got = GetBit(x, y + 1);
if(got)
{
multi = SobelTemplateGy[7];
tempr += multi * got->r;
tempg += multi * got->g;
tempb += multi * got->b;
}
got = GetBit(x + 1, y + 1);
if(got)
{
multi = SobelTemplateGy[8];
tempr += multi * got->r;
tempg += multi * got->g;
tempb += multi * got->b;
}
result += fabs(tempr) + fabs(tempg) + fabs(tempb);
if(result > 255 * 8)
*cur_pos++ = 255;
else
*cur_pos++ = result / 8;
}
}
// m_bDispSobel = true;
// AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_SOBEL, MF_CHECKED);
// InvalidateRect(0, TRUE);
}
}
RGB* CCellView::GetBit(int x, int y)
{
if(x < 0 || x >= g_nMapWidth || y < 0 || y >= g_nMapHeight)
return 0;
return (g_pImgBuffer + y * g_nMapWidth + x);
}
void CCellView::OnProcHistogram()
{
if(g_hBitmap)
{
CHistogramDlg hDlg;
if(hDlg.DoModal() == IDOK)
{
// backup
// memcpy(g_pImgBufferBack,g_pImgBuffer,
// sizeof(RGB)*g_nMapWidth*g_nMapHeight);
memcpy(g_pFlagsBack,g_pFlags,
sizeof(FLAGS)*g_nMapWidth*g_nMapHeight);
// g_bImgBufferChanged=true;
FLAGS *cur_flag = g_pFlags;
RGB *cur=g_pImgBuffer;
for(int j = 0; j < g_nMapHeight; j++)
{
for(int i = 0; i < g_nMapWidth; i++)
{
if(!(cur_flag->marked))
{
if ( (cur->b >= hDlg.m_Thresh_B && cur->b <= hDlg.m_Thresh_BMax)
&& (cur->r >= hDlg.m_Thresh_R && cur->r <= hDlg.m_Thresh_RMax)
&& (cur->g >= hDlg.m_Thresh_G && cur->g <= hDlg.m_Thresh_GMax))
{
cur_flag->marked = 1;
// cur->r=cur->g=cur->b=0; // 不改变了原图了!
}
}
cur_flag++;
cur++;
}
}
GenEdge();
InvalidateRect(0, TRUE);
}
}
else MessageBox("请先打开图像文件!");
}
void CCellView::GenEdge() // 八方向生成边界
{
FLAGS *cur = g_pFlags;
int width = g_nMapWidth;
int height = g_nMapHeight;
for(int j = 0; j < g_nMapHeight; j++)
{
for(int i = 0; i < g_nMapWidth; i++)
{
cur->edged = 0;
if(cur->marked)
{
if(j == 0 && i == 0) // left top
{
if(!((cur + 1)->marked && (cur + width)->marked && (cur + width + 1)->marked)) cur->edged = 1;
}
else if(j == 0 && i == width - 1) // right top
{
if(!((cur - 1)->marked && (cur + width)->marked && (cur + width - 1)->marked)) cur->edged = 1;
}
else if(j == height - 1 && i == 0) // bottom left
{
if(!((cur + 1)->marked && (cur - width)->marked && (cur - width + 1)->marked)) cur->edged = 1;
}
else if(j == height - 1 && i == width - 1) // bottom right
{
if(!((cur - 1)->marked && (cur - width)->marked && (cur - width - 1)->marked)) cur->edged = 1;
}
else if(j == 0) // top
{
if
(
!((cur - 1)->marked
&& (cur + 1)->marked
&& (cur + width - 1)->marked
&& (cur + width + 1)->marked
&& (cur + width)->marked
)
) cur->edged = 1;
}
else if(i == 0) // left
{
if
(
!((cur - width)->marked
&& (cur - width + 1)->marked
&& (cur + 1)->marked
&& (cur + width)->marked
&& (cur + width + 1)->marked
)
) cur->edged = 1;
}
else if(j == height - 1) // bottom
{
if
(
!((cur - 1)->marked
&& (cur + 1)->marked
&& (cur - width - 1)->marked
&& (cur - width + 1)->marked
&& (cur - width)->marked
)
) cur->edged = 1;
}
else if(i == width - 1) // right
{
if
(
!((cur - width)->marked
&& (cur - width - 1)->marked
&& (cur - 1)->marked
&& (cur + width)->marked
&& (cur + width - 1)->marked
)
) cur->edged = 1;
}
else // normal
{
if
(
!((cur - width - 1)->marked
&& (cur - width)->marked
&& (cur - width + 1)->marked
&& (cur - 1)->marked
&& (cur + 1)->marked
&& (cur + width - 1)->marked
&& (cur + width)->marked
&& (cur + width + 1)->marked
)
) cur->edged = 1;
}
}
cur++;
}
}
}
void CCellView::GenEdge4()// 四方向生成边界
{
FLAGS *cur = g_pFlags;
int width = g_nMapWidth;
int height = g_nMapHeight;
for(int j = 0; j < g_nMapHeight; j++)
{
for(int i = 0; i < g_nMapWidth; i++)
{
cur->edged = 0;
if(cur->marked)
{
if(j == 0 && i == 0) // left top
{
if(!((cur + 1)->marked && (cur + width)->marked && (cur + width + 1)->marked)) cur->edged = 1;
}
else if(j == 0 && i == width - 1) // right top
{
if(!((cur - 1)->marked && (cur + width)->marked && (cur + width - 1)->marked)) cur->edged = 1;
}
else if(j == height - 1 && i == 0) // bottom left
{
if(!((cur + 1)->marked && (cur - width)->marked && (cur - width + 1)->marked)) cur->edged = 1;
}
else if(j == height - 1 && i == width - 1) // bottom right
{
if(!((cur - 1)->marked && (cur - width)->marked && (cur - width - 1)->marked)) cur->edged = 1;
}
else if(j == 0) // top
{
if
(
!((cur - 1)->marked
&& (cur + 1)->marked
&& (cur + width - 1)->marked
&& (cur + width + 1)->marked
&& (cur + width)->marked
)
) cur->edged = 1;
}
else if(i == 0) // left
{
if
(
!((cur - width)->marked
&& (cur - width + 1)->marked
&& (cur + 1)->marked
&& (cur + width)->marked
&& (cur + width + 1)->marked
)
) cur->edged = 1;
}
else if(j == height - 1) // bottom
{
if
(
!((cur - 1)->marked
&& (cur + 1)->marked
&& (cur - width - 1)->marked
&& (cur - width + 1)->marked
&& (cur - width)->marked
)
) cur->edged = 1;
}
else if(i == width - 1) // right
{
if
(
!((cur - width)->marked
&& (cur - width - 1)->marked
&& (cur - 1)->marked
&& (cur + width)->marked
&& (cur + width - 1)->marked
)
) cur->edged = 1;
}
else // normal
{
if
(
!((cur - width)->marked
&& (cur - 1)->marked
&& (cur + 1)->marked
&& (cur + width)->marked
)
) cur->edged = 1;
}
}
cur++;
}
}
}
void CCellView::OnProcSpecColor()
{
CColorDialog cDlg;
if(cDlg.DoModal() == IDOK)
{
COLORREF cr = cDlg.GetColor();
spec_rgb.b = cr >> 16 & 0xff;
spec_rgb.g = cr >> 8 & 0xff;
spec_rgb.r = cr & 0xff;
InvalidateRect(0, TRUE);
}
}
void CCellView::OnDispEdge()
{
if (g_hBitmap)
{
if(!m_bIsDispEdge)
{
m_bIsDispEdge = true;
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_EDGE, MF_CHECKED);
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_REGION, MF_UNCHECKED);
InvalidateRect(0, TRUE);
}
}
else
MessageBox("请先打开文件");
}
void CCellView::OnDispRegion()
{
if (g_hBitmap)
{
if(m_bIsDispEdge)
{
m_bIsDispEdge = false;
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_REGION, MF_CHECKED);
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_EDGE, MF_UNCHECKED);
InvalidateRect(0, TRUE);
}
}
else
MessageBox("请先打开文件");
}
void CCellView::OnDispSobel()
{
if (!g_hBitmap)
{
MessageBox("请先打开文件");
return;
}
if (!g_pSobelResult)
{
MessageBox("请选择菜单[处理]-[显示→Sobel]来查看梯度信息");
return;
}
m_bDispSobel ^= 1;
if(m_bDispSobel)
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_SOBEL, MF_CHECKED);
else
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_SOBEL, MF_UNCHECKED);
// g_bImgBufferChanged=true;
InvalidateRect(0, TRUE);
}
void CCellView::OnProcReload()
{
// TODO: Add your command handler code here
if (g_hBitmap)
{
// g_pFlags置0
memset(g_pFlags, 0, g_nMapHeight * g_nMapWidth * sizeof(FLAGS));
// memcpy(g_pImgBuffer,g_pOrgImgBuffer,sizeof(RGB)*g_nMapWidth*g_nMapHeight);
// g_bImgBufferChanged=true;
m_bProcHsi=false;
m_bDispSobel=false;
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_SOBEL, MF_UNCHECKED);
m_bIsDispEdge=false;
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_REGION, MF_CHECKED);
AfxGetApp()->m_pMainWnd->GetMenu()->CheckMenuItem(ID_DISP_EDGE, MF_UNCHECKED);
m_vCenterPoints.clear(); // 清除!
InvalidateRect(0,TRUE);
}
else
MessageBox("请先打开文件");
}
void CCellView::OnProcFindCenter()
{
if(g_hBitmap)
{
// backup
memcpy(g_pFlagsBack,g_pFlags,
sizeof(FLAGS)*g_nMapWidth*g_nMapHeight);
int pre_shrink_count;
CSet setdlg;
if (IDOK==setdlg.DoModal()) // 对话框.输入腐蚀次数
{
pre_shrink_count=setdlg.m_nPreCount;
}
else return;
int i,j,x,y;
FLAGS *cur_flag;
// 先去掉pre_shrink_count层皮
GenEdge();
for (i=0;i<pre_shrink_count;i++)
{
cur_flag=g_pFlags;
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
// 去掉边界!
if (cur_flag->edged)
cur_flag->marked=0;
cur_flag++;
}
if (i==0)
GenEdge4();
else
GenEdge();
}
InvalidateRect(NULL,TRUE);
MessageBox("去掉了噪声");
cur_flag=g_pFlags; // 清除visited标志
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
cur_flag->visited=0;
cur_flag->center=0;
cur_flag++;
}
GenEdge();
CENTER_POINT pt;
points_temp.clear();
bool changed;
for (i=0;i<40;i++) // 标志中心点的腐蚀
{
changed=false;
// 清除visited标志
cur_flag=g_pFlags;
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
cur_flag->visited=0;
cur_flag++;
}
cur_flag=g_pFlags;
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
if (y>0 && y<g_nMapHeight-1 && x>0 && x<g_nMapWidth-1) // 最边上的不用处理
{
m_bFullEdge=true;
if (cur_flag->edged && !cur_flag->visited) // 没有访问过的边界
{
if ( !(cur_flag-1)->marked &&
!(cur_flag+1)->marked &&
!(cur_flag+g_nMapWidth)->marked &&
!(cur_flag-g_nMapWidth)->marked )
// !(cur_flag+g_nMapWidth-1)->marked &&
// !(cur_flag+g_nMapWidth+1)->marked &&
// !(cur_flag-g_nMapWidth-1)->marked &&
// !(cur_flag-g_nMapWidth+1)->marked )
{
if (i==0) // 基本上这种是噪音
{
cur_flag++;
continue;
}
// 孤立的点
cur_flag->center=1;
// 保存一下CENTER_POINT信息
pt.x=x;
pt.y=y;
pt.radius=i+4+pre_shrink_count*2;
points_temp.push_back(pt);
cur_flag++;
continue;
}
else
MarkIt(x,y); // 判断是否需要保存
if (m_bFullEdge) // 需要保存!
SaveIt(x,y,i+6);
}
}
cur_flag++;
}
cur_flag=g_pFlags;
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
// 去掉边界!
if (cur_flag->edged)
{
changed=true;
cur_flag->marked=0;
}
cur_flag++;
}
if (i%2==0)
GenEdge4();
else
GenEdge();
if (!changed)
break;
}
// 清除visited标志
cur_flag=g_pFlags;
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
cur_flag->visited=0;
cur_flag++;
}
// 取平均值,获得中心点
vector<CENTER_POINT> points;
cur_flag=g_pFlags;
for(y = 0; y < g_nMapHeight; y++)
for(x = 0; x < g_nMapWidth; x++)
{
if (y>0 && y<g_nMapHeight-1 && x>0 && x<g_nMapWidth-1) // 最边上的不用处理
{
if (cur_flag->center)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -