久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2945|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Freeimage自動(dòng)閾值分割

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:77367 發(fā)表于 2015-4-18 20:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
Freeimage的圖片切割分塊的處理。。。。尼瑪突然感到頭好暈。。。。。。。。。。。




/////////////////////////////////////////////////////////////////////////////////////////
//源代碼

1、otsu閾值分割


/*
parameter:   *image              --- buffer for image
rows, cols        --- size of image
     x0, y0, dx, dy   --- region of vector used for computing threshold
vvv                  --- debug option, is 0, no debug information outputed
*/

/*======================================================================*/
/*   OTSU global thresholding routine                                   */
/*   takes a 2D unsigned char array pointer, number of rows, and        */
/*   number of cols in the array. returns the value of the threshold    */
/*======================================================================*/
int CStatintDlg::otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv)
{
unsigned char *np;      // 圖像指針
int thresholdValue=1; // 閾值
int ihist[256];             // 圖像直方圖,256個(gè)點(diǎn)
int i, j, k;          // various counters
int n, n1, n2, gmin, gmax;
double m1, m2, sum, csum, fmax, sb;
// 對(duì)直方圖置零...
memset(ihist, 0, sizeof(ihist));
gmin=255; gmax=0;
// 生成直方圖
for (i = y0 + 1; i < y0 + dy - 1; i++) {
np = &image[i*cols+x0+1];
for (j = x0 + 1; j < x0 + dx - 1; j++) {
ihist[*np]++;
if(*np > gmax) gmax=*np;
if(*np < gmin) gmin=*np;
np++; /* next pixel */
}
}
// set up everything
sum = csum = 0.0;
n = 0;
for (k = 0; k <= 255; k++) {
sum += (double) k * (double) ihist[k];    /* x*f(x) 質(zhì)量矩*/
n   += ihist[k];                                         /*  f(x)    質(zhì)量    */
}
if (!n) {
// if n has no value, there is problems...
fprintf (stderr,"NOT NORMAL thresholdValue = 160\n");
return (160);
}
// do the otsu global thresholding method
fmax = -1.0;
n1 = 0;
for (k = 0; k < 255; k++) {
n1 += ihist[k];
if (!n1) { continue; }
n2 = n - n1;
if (n2 == 0) { break; }
csum += (double) k *ihist[k];
m1 = csum / n1;
m2 = (sum - csum) / n2;
sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
/* bbg: note: can be optimized. */
if (sb > fmax) {
fmax = sb;
thresholdValue = k;
}
}
// at this point we have our thresholding value
// debug code to display thresholding values
if ( vvv & 1 )
fprintf(stderr,"# OTSU: thresholdValue = %d gmin=%d gmax=%d\n",
thresholdValue, gmin, gmax);
return(thresholdValue);
}


//快速判別
void CStatintDlg::OnBnClickedDiscrimination()
{
if(m_kOrgImage.IsEmpty())  //there is no image we should exit from here
return;

size_t bpp = m_kOrgImage.GetBPP();
    if(1 == bpp) return;

m_kOrgImage.ConvertToGreyscale();
BYTE *lpBits = m_kOrgImage.GetBits();
    unsigned int width = m_kOrgImage.GetWidth();
unsigned int height = m_kOrgImage.GetHeight();

   m_Threshold = otsu(lpBits,height,width,0,0,width,height,0);
   TRACE1("otsu=%d\n\n",m_Threshold);

   ASSERT(m_Threshold >0 && m_Threshold < 256);
   //////////////////////////////////////////////////////////////////////////
   unsigned int v = ( width - 1 ) / m_nBlockWidth + 1;
   unsigned int h = ( height - 1 ) / m_nBlockheight + 1;

  dMatrix Ratiomat(h,v);   //比列矩陣
  uMatrix BitMat(h,v);     //0-1矩陣  

   long sFront,sBack;
   double fRatio;

   for(unsigned int j = 0; j < h; j ++ )
   {
   for(unsigned int i = 0; i < v; i ++ )
   {
   RECT rt;
   rt.left = i * m_nBlockWidth;
   rt.top = j * m_nBlockheight;
   rt.right = rt.left + m_nBlockWidth;
   rt.bottom = rt.top + m_nBlockheight;
   if( rt.right > (LONG)width ){
   rt.right = width;
   }

   if( rt.bottom > (LONG)height ){
   rt.bottom = height;
   }

   FIBITMAP* pCut = ::FreeImage_Copy( m_kOrgImage.GetHandle(), rt.left, rt.top, rt.right, rt.bottom );
    ::FreeImage_GetHistogram(pCut , m_hgray, FICC_RGB);

sFront = 0;
sBack = 0;
for (unsigned int k = 0;k<256;k++)
{
if(k > m_Threshold)
sFront += m_hgray[k];
else
sBack += m_hgray[k];
}

if(0 == sBack)   //防止處以0
fRatio = 1.0f;
else
    fRatio = (double)sFront/(double)sBack;

            Ratiomat[j] = fRatio;

if ( (abs(fRatio - m_fLowVal) > 1e-20 ) && (abs(fRatio - m_fHighVal) > 1e-20 ))
BitMat[j] = 1;
else
BitMat[j] = 0;


//舉例怎么取矩陣的值
TRACE3("Ratiomat[%d][%d]=%f%%\n",j,i,fRatio*100);

   if( pCut )
   ::FreeImage_DestroyICCProfile( pCut );

   }
   }


   //////////////////////////////////////////////////////////////////////////

   m_kOrgImage.Threshold(m_Threshold);

   UpdateImage();

}






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产91久久久久蜜臀青青天草二 | 99精品免费久久久久久久久日本 | 九九九久久国产免费 | 日日夜夜精品免费视频 | 精品国产乱码久久久久久蜜柚 | 精品视频在线观看 | 91久久婷婷 | 国产一区二区三区在线 | 一级高清| 久久久久久国产精品免费免费男同 | 成人国产一区二区三区精品麻豆 | 午夜欧美 | 成人免费淫片aa视频免费 | 成人在线免费视频 | 日韩欧美一区二区三区四区 | 神马久久久久久久久久 | www.久草.com| 免费精品视频一区 | 日韩一级| 亚洲精品不卡 | 国产粉嫩尤物极品99综合精品 | 精品国产色| 亚洲综合大片69999 | 欧美激情国产日韩精品一区18 | 成人欧美一区二区三区黑人孕妇 | 国产亚洲一区二区三区 | 国产伦一区二区三区四区 | 欧美日高清 | 欧美一区日韩一区 | 亚洲丝袜天堂 | 日韩α片 | 91精品国产色综合久久不卡98 | 欧美日批| 成人精品一区二区 | 欧美精品一区二区蜜桃 | 一区二区三区视频在线观看 | 国产婷婷在线视频 | 日韩一区二区三区在线视频 | 欧美亚洲第一区 | 欧美美女被c | 精品国产一区二区在线 |