以上是在将位图加载到内存中,直接在加载的内存中操作像素的结果,很美!
但是!以下这段代码,新开辟了一段内存,出现的结果竟然是原图???????,不得解,已经解决了,问题的根源就是出现在CDib::Draw函数的内部的lpData, // 指向DIB数据的指针,之前错误的时候用的是CDib::m_lpData,自然不对。
void CRightView::clearmem()
{
CSpliter2Doc * pDoc = (CSpliter2Doc*)GetDocument();
ASSERT_VALID(pDoc);
pDoc->statedoc = 0;
state2 = 1;
m_imagex = pDoc->Cdib.GetWidth();
m_imagey = pDoc->Cdib.GetHeight();
long int size = m_imagex * m_imagey;
if(pDoc->Cdib.GetBitCount() > 8) // 真彩图
AfxMessageBox("No");
else{}
image_in = new BYTE[size];
image_out = new BYTE[size];
memcpy(image_in,pDoc->Cdib.m_lpData,size); // 复制原图像数据到处理区
}
void CRightView::OnShowtwo()
{
CSpliter2Doc * pDoc = (CSpliter2Doc*)GetDocument();
ASSERT_VALID(pDoc);
// TODO: Add your command handler code here
clearmem();
for(int i = 0; i < m_imagey; i++)
{
for(int j = 0; j < m_imagex; j++)
{
//if(*(image_in + i*m_imagex + j) > 128)
// *(image_out + i*m_imagex + j) = 255;
//else
*(image_out + i*m_imagex + j) = 0;
}
}
接下来,以Lina图为例,分析一下各种二值化方法:
一:灰度平局值值法:
即使用整幅图像的灰度平均值作为二值化的阈值,一般该方法可作为其他方法的初始猜想值。