⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cellview.cpp

📁 医学图像处理中中的对细胞进行识别的一个系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					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 + -