help edge%在仔细阅读功能edge()的指令之后,研究IPT提供的边缘检测演示程序。 edgedemo(二)使用MATLAB熟悉并验证其他图像分割方法(三)使用MATLAB编程来实现自动全局阈值算法,并对图像'rice.tif'执行二值化分割算法。步骤:1)选择初始估计值T;2)将图像除以T。这将生成两组像素:G1由灰度值大于T的所有像素组成,G2由灰度值小于或等于T的所有像素组成3)计算G1和G2中所有像素的平均灰度值?1和?2。4)计算新的阈值:T =(?1 +?2) / 25)重复步长[2)至(4),直到通过连续迭代获得的T值的差小于预先定义的参数To,也就是说,如果| Tn – Tn-1 | K,则乘数使用的大约是N * M * K * K。乘法是可见的,顺序与模板宽度的平方成正比。实际上,LOG过滤器可以分解将其装入高斯滤波器和另一个具有较小模板宽度的LOG滤波器。另的数字void Multiply(BYTE * pBuffer,DWORD Size,DWORD Width,DWORD Height); //模板和数组的操作void SetTemplate(const int nDefTemplate); //设置模板的参数};四、实验结果和分析实验采用灰度,如所附图片2.1图片,图片尺寸为170×375,模板为5×5,如下所示:-2,-4,- 4,-4,-2,-4,0,8,0,-4,-4,8,24,8,-4,-4,0,8,0,-4,-2,-4, -4,-4,-2由LOG过滤以得到带有附加图片2.2的结果,所使用的相乘次数为1539650,并验证了1539650 =(170-5 + 1) ×(375-5 + 1)×5×5),符合上面的公式。
如果将原始图像缩小为一半大小(85×188),则进行高斯滤波和LOG滤波,然后插值到原始图像大小,结果如图2.3所示。使用的乘法数为517816,其中高斯滤波的乘法数为140616 =(85 + 1-3 + 1)×(188-3 + 1)×3×3),LOG滤波的乘法数为377200 =(85 + 1-5 + 1)×(188-5 +)1)×5×5。显然大大减少了乘法次数。图2.1(原始图像)图2.2(对数过滤结果)图2.3(过滤后的插值结果)五、附加的关键源程序BOOL CFilter :: Filter(const int nDefTemplate,BYTE * pBuffer,DWORD Size,DWORD Width,DWORD Height){SetTemplate(nDefTemplate); if (!pBuffer){返回false;} //缓冲区为空,如果((Width + 1 6) * HeightSize)//非8位彩色位图{// MYTODO:转换为8位AfxMessageBox(“ non-256不支持颜色位图“); //返回false;}相乘(pBuffer,Size,Widt h,Height);返回true;} void CFilter :: SetTemplate(const int nDefTemplate){if(m_pTemplate){delete [] m_pTemplate; } switch(nDefTemplate){案例TEMPLATE_LOG:{m_TemplateWidth = 5; m_fCoef = 1; BYTE btTemplateSize = m_TemplateWidth * m_TemplateWidth; m_pTemplate = new char [btTemplateSize]; char btTemp [25] = {-2,-4,-4,- 4,-2,-4,0,8,0,-4,-4,8,24,8,-4,-4,0,8,0,-4,-2,-4,-4, -4,-2}; :: memcpy(m_pTemplate,&btTemp,btTemplateSize);} break; case TEMPLATE_LAPLACIAN:{m_TemplateWi dth = 3; m_fCoef = 1; BYTE btTemplateSize = m_TemplateWidth * m_TemplateWidth; m_pTemplate = new char [btTemplateSize]; char btTemp [9] = {-1,-1,-1,-1,9,-1,-1,-1,-1}; :: memcpy(m_pTemplate,&btTemp,btTemplateSize);} break;案例TEMPLATE_GAUSS:{m_TemplateWidth = 3; m_fCoef = 1/16.0; //不是1/16,否则它将变为0 BYTE btTemplateSize = m_TemplateWidth * m_TemplateWidth; m_pTemplate = new char [btTemplateSize]; char btTemp [9] = {1,2,1,2,4,2,1,2,1}; :: memcpy(m_pTemplate,&btTemp,btTemplateSize);} break;默认值:TRACE(“没有这样的默认模板”);}} void CFilter :: Multiply(BYTE * pBuffer,DWORD Size,DWORD Width,DWORD Height){ int nBorder = m_TemplateWidth / 2; //需要打开DWORD大小dwOffset = 0;浮动fResult = 0; int nTempNum = 0; BYTE * pTempBuffer =新BYTE [Size]; for(DWORD y = 0 + nBorder; y255.0)返回(BYTE)255;否则if(fNum
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-325082-2.html
你出名了