Bmptestview.cpp
上传用户:cjd055
上传日期:2013-04-01
资源大小:608k
文件大小:65k
源码类别:

交通/航空行业

开发平台:

Visual C++

  1. // BmpTestView.cpp : implementation of the CBmpTestView class
  2. //
  3. #include "stdafx.h"
  4. #include "BmpTest.h"
  5. #include "stack.h"
  6. #include "BmpTestDoc.h"
  7. #include "BmpTestView.h"
  8. #include <math.h>
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #define MIN(a,b) (a<b? a:b)
  15. #define MAX(a,b) (a>b? a:b)
  16. #define NO_HUE -1;
  17. int m_Grade[256],m_Gradmax=0,m_Grade_Blue[256],m_Grade_Green[256],m_Grade_Red[256],b[1024][1024];
  18. extern void str(int quotient,char addr[15]);
  19. extern BOOL  Contour(CBmpTestDoc* pDoc,double *pAnew_mon,BOOL bmoment,double n,double *protate);
  20. extern BOOL  GCC(CBmpTestDoc* pDoc,double *n,POINT *gcc);
  21. extern void Sh_Rotate(CBmpTestDoc* pDoc,double ro_angle,double size,POINT *pav_cent);
  22. DISTANCE distbmp[50];
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CBmpTestView
  25. IMPLEMENT_DYNCREATE(CBmpTestView, CScrollView)
  26. BEGIN_MESSAGE_MAP(CBmpTestView, CScrollView)
  27. //{{AFX_MSG_MAP(CBmpTestView)
  28. ON_COMMAND(ID_BT_BLACKNESS, OnBtBlackness)
  29. ON_COMMAND(ID_BT_DSTINVERT, OnBtDstinvert)
  30. ON_COMMAND(ID_BT_MERGECOPY, OnBtMergecopy)
  31. ON_COMMAND(ID_BT_MERGEPAINT, OnBtMergepaint)
  32. ON_COMMAND(ID_BT_NOTSRCCOPY, OnBtNotsrccopy)
  33. ON_COMMAND(ID_BT_NOTSRCERASE, OnBtNotsrcerase)
  34. ON_COMMAND(ID_BT_PATCOPY, OnBtPatcopy)
  35. ON_COMMAND(ID_BT_PATINVERT, OnBtPatinvert)
  36. ON_COMMAND(ID_BT_PATPAINT, OnBtPatpaint)
  37. ON_COMMAND(ID_BT_SRCAND, OnBtSrcand)
  38. ON_COMMAND(ID_BT_SRCCOPY, OnBtSrccopy)
  39. ON_COMMAND(ID_BT_SRCERASE, OnBtSrcerase)
  40. ON_COMMAND(ID_BT_SRCINVERT, OnBtSrcinvert)
  41. ON_COMMAND(ID_BT_SRCPAINT, OnBtSrcpaint)
  42. ON_COMMAND(ID_BT_WHITENESS, OnBtWhiteness)
  43. ON_COMMAND(ID_ZFT_SHOW, OnZftShow)
  44. ON_COMMAND(ID_ZFT_BALANCE, OnZftBalance)
  45. ON_COMMAND(ID_IMAGE_SHOW, OnImageShow)
  46. ON_COMMAND(ID_DTSM_IN, OnDtsmIn)
  47. ON_COMMAND(ID_DTSM_SHOW, OnDtsmShow)
  48. ON_COMMAND(ID_DTSM_OUT, OnDtsmOut)
  49. ON_COMMAND(ID_REC_FILT, OnRecFilt)
  50. ON_COMMAND(ID_MID_FILT, OnMidFilt)
  51. ON_COMMAND(ID_EDGE_ROBERT, OnEdgeRobert)
  52. ON_COMMAND(ID_EDGE_LAPLACE, OnEdgeLaplace)
  53. ON_COMMAND(ID_GAUSE_FILT, OnGauseFilt)
  54. ON_COMMAND(ID_EDGE_MARR, OnEdgeMarr)
  55. ON_COMMAND(ID_STRU_ADD, OnStruAdd)
  56. ON_COMMAND(ID_STRU_SUB, OnStruSub)
  57. ON_COMMAND(ID_STRU_OPEN, OnStruOpen)
  58. ON_COMMAND(ID_STRU_CLOSE, OnStruClose)
  59. ON_COMMAND(ID_EDIT_BACKUP, OnEditBackup)
  60. ON_COMMAND(ID_EDIT_BLUE, OnEditBlue)
  61. ON_COMMAND(ID_EDIT_GREEN, OnEditGreen)
  62. ON_COMMAND(ID_EDIT_RED, OnEditRed)
  63. ON_COMMAND(ID_EDGE_COLORPREWITT, OnEdgeColorprewitt)
  64. ON_COMMAND(ID_EDGE_COLORROBERT, OnEdgeColorrobert)
  65. ON_COMMAND(ID_MID_FILT_LINE, OnMidFiltLine)
  66. ON_COMMAND(ID_DENSITY_SCAN, OnDensityScan)
  67. ON_COMMAND(ID_ROW_DILATION, OnRowDilation)
  68. ON_COMMAND(ID_EDGE_COLORPREWITT1, OnEdgeColorprewitt1)
  69. ON_COMMAND(ID_EDGE_COLORROBERT1, OnEdgeColorrobert1)
  70. ON_COMMAND(ID_ROW_EROSION, OnRowErosion)
  71. ON_COMMAND(ID_CLOSE, OnClose)
  72. ON_COMMAND(ID_GET, OnGet)
  73. ON_COMMAND(ID_RELA_SCAN, OnRelaScan)
  74. ON_COMMAND(ID_DENSITY_SCAN_MID, OnDensityScanMid)
  75. ON_COMMAND(ID_AREA_MARK, OnAreaMark)
  76. ON_COMMAND(ID_LOCATING, OnLocating)
  77. ON_COMMAND(ID_VEHICLE_BITMAP, OnVehicleBitmap)
  78. ON_COMMAND(ID_BLUE_CUT, OnBlueCut)
  79. //}}AFX_MSG_MAP
  80. // Standard printing commands
  81. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  82. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  83. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  84. END_MESSAGE_MAP()
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CBmpTestView construction/destruction
  87. CBmpTestView::CBmpTestView()
  88. {
  89. // TODO: add construction code here
  90. m_Rop=SRCCOPY;
  91. }
  92. CBmpTestView::~CBmpTestView()
  93. {
  94. }
  95. BOOL CBmpTestView::PreCreateWindow(CREATESTRUCT& cs)
  96. {
  97. // TODO: Modify the Window class or styles here by modifying
  98. //  the CREATESTRUCT cs
  99. return CScrollView::PreCreateWindow(cs);
  100. }
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CBmpTestView drawing
  103. void CBmpTestView::OnDraw(CDC* pDC)
  104. {
  105. CPen pen,*open;
  106. CBmpTestDoc* pDoc = GetDocument();
  107. ASSERT_VALID(pDoc);
  108. // TODO: add draw code for native data here
  109. //设置滚动视图大小,使之与Dib大小一致:
  110. CSize sizeTotal;
  111. sizeTotal.cx = pDoc->m_Dib.Width;
  112. sizeTotal.cy = pDoc->m_Dib.Height+100;
  113. SetScrollSizes(MM_TEXT, sizeTotal);
  114. //绘制Dib:
  115. if (pDoc->m_BM)
  116. {
  117. //在滚动视图中绘制背景:
  118.      CBitmap pat;
  119.     CBrush br,* obr;
  120. CRect rc;
  121. rc.top=0;
  122. rc.left=0;
  123. rc.right=sizeTotal.cx;
  124. rc.bottom=sizeTotal.cy;
  125. GetClientRect(&rc);  //获得矩形区域大小
  126. pat.LoadBitmap(IDB_BITMAP2); //IDB_BITMAP2->pat
  127. br.CreatePatternBrush(&pat); //创建模式刷, pat->br
  128. obr=pDC->SelectObject(&br);
  129. pDC->FillRect(&rc,&br); //用画刷填充整个矩形区域
  130. pDC->SelectObject(obr);
  131. br.DeleteObject(); 
  132. CRect dibrect;
  133. dibrect.top=0;
  134. dibrect.left=0;
  135. dibrect.right=sizeTotal.cx;
  136. dibrect.bottom=sizeTotal.cy;
  137. pDoc->m_Dib.Draw(pDC->GetSafeHdc(),dibrect,dibrect);
  138.     }
  139. /*绘制DDB:
  140. CBitmap ddb;
  141. ddb.LoadBitmap( IDB_BITMAP1 );
  142.     // Calculate bitmap size using a BITMAP structure.
  143.     BITMAP bm;
  144.     ddb.GetObject( sizeof(BITMAP), &bm );
  145.     // Create a memory DC, select the bitmap into the
  146.     // memory DC, and BitBlt it into the view.
  147.     CDC dcMem;
  148.     dcMem.CreateCompatibleDC( pDC );
  149.     CBitmap* pbmpOld = dcMem.SelectObject( &ddb );
  150.     pDC->BitBlt( dibrect.Width()/2,dibrect.Height()/2,
  151.  dibrect.Width()/2+bm.bmWidth,dibrect.Height()/2+bm.bmHeight,
  152.                  &dcMem,
  153.  0,0,
  154.  m_Rop 
  155.  ); 
  156.     // Reselect the original bitmap into the memory DC.
  157.     dcMem.SelectObject( pbmpOld ); */
  158. else
  159. {
  160.      CBrush br,* obr;
  161.     CRect rc;
  162. CString s;
  163. rc.top=0;
  164. rc.left=0;
  165. rc.right=sizeTotal.cx;
  166. rc.bottom=sizeTotal.cy;
  167.      GetClientRect(&rc);
  168.     br.CreateSolidBrush(RGB(255,255,255));
  169.     obr=pDC->SelectObject(&br);
  170.      pDC->FillRect(&rc,&br);
  171.     pDC->SelectObject(obr);
  172.     br.DeleteObject(); 
  173. if(pDoc->m_Dib.BPP>=16)
  174. {
  175. pen.CreatePen(0,2,RGB(0,0,255));
  176.      open=pDC->SelectObject(&pen);
  177. pDC->MoveTo(10,150);
  178. pDC->LineTo(520,150);
  179.      int i,j=10,k=0;
  180. for ( i=0;i<256;i=i+20)
  181. {
  182. s.Format("%d",i);
  183.                pDC->TextOut(10+i*2, 150,  s);
  184. }
  185. for ( i=0;i<256;i++)
  186. {
  187.      pDC->MoveTo(j,150);
  188.     if (m_Gradmax!=0) k=150-(int)m_Grade_Blue[i]*150/m_Gradmax;
  189.          pDC->LineTo(j,k);
  190.          j=j+2;
  191. }
  192. pen.DeleteObject();
  193. pen.CreatePen(0,2,RGB(0,255,0));
  194.      open=pDC->SelectObject(&pen);
  195. pDC->MoveTo(10,310);
  196. pDC->LineTo(520,310);
  197. j=10;
  198. for ( i=0;i<256;i=i+20)
  199. {
  200. s.Format("%d",i);
  201.                pDC->TextOut(10+i*2, 310, s);
  202. }
  203. for ( i=0;i<256;i++)
  204. {
  205.      pDC->MoveTo(j,310);
  206.     if (m_Gradmax!=0) k=310-(int)m_Grade_Green[i]*150/m_Gradmax;
  207.          pDC->LineTo(j,k);
  208.          j=j+2;
  209. }
  210. pen.DeleteObject();
  211. pen.CreatePen(0,2,RGB(255,0,0));
  212.      open=pDC->SelectObject(&pen);
  213. pDC->MoveTo(10,470);
  214. pDC->LineTo(520,470);
  215. for ( i=0;i<256;i=i+20)
  216. {
  217. s.Format("%d",i);
  218.                pDC->TextOut(10+i*2, 470, s);
  219. }
  220. j=10;
  221. for ( i=0;i<256;i++)
  222. {
  223.      pDC->MoveTo(j,470);
  224.     if (m_Gradmax!=0) k=470-(int)m_Grade_Red[i]*150/m_Gradmax;
  225.          pDC->LineTo(j,k);
  226.          j=j+2;
  227. }
  228. j=10;
  229. pDC->SelectObject(open);
  230. pen.DeleteObject();
  231. pDC->MoveTo(j,10);
  232. }
  233. else 
  234. {
  235.      pen.CreatePen(0,2,RGB(0,0,0));
  236.      open=pDC->SelectObject(&pen);
  237. pDC->MoveTo(10,260);
  238. pDC->LineTo(520,260);
  239. pDC->TextOut(200, 300, " 的直方图");
  240.      int i,j=10,k=0;
  241. for ( i=0;i<256;i=i+20)
  242. {
  243. s.Format("%d",i);
  244. pDC->TextOut(10+i*2, 260, s);
  245. }
  246. for ( i=0;i<256;i++)
  247. {
  248.      pDC->MoveTo(j,260);
  249.     if (m_Gradmax!=0) k=260-(int)m_Grade[i]*250/m_Gradmax;
  250.          pDC->LineTo(j,k);
  251.          j=j+2;
  252. }
  253. pDC->SelectObject(open);
  254. pen.DeleteObject();
  255. pDC->MoveTo(j,10);
  256. }
  257. }
  258. }
  259. void CBmpTestView::OnInitialUpdate()
  260. {
  261. CScrollView::OnInitialUpdate();
  262. CSize sizeTotal;
  263. // TODO: calculate the total size of this view
  264. sizeTotal.cx = sizeTotal.cy = 100;
  265. SetScrollSizes(MM_TEXT, sizeTotal);
  266. }
  267. /////////////////////////////////////////////////////////////////////////////
  268. // CBmpTestView printing
  269. BOOL CBmpTestView::OnPreparePrinting(CPrintInfo* pInfo)
  270. {
  271. // default preparation
  272. return DoPreparePrinting(pInfo);
  273. }
  274. void CBmpTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  275. {
  276. // TODO: add extra initialization before printing
  277. }
  278. void CBmpTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  279. {
  280. // TODO: add cleanup after printing
  281. }
  282. /////////////////////////////////////////////////////////////////////////////
  283. // CBmpTestView diagnostics
  284. #ifdef _DEBUG
  285. void CBmpTestView::AssertValid() const
  286. {
  287. CScrollView::AssertValid();
  288. }
  289. void CBmpTestView::Dump(CDumpContext& dc) const
  290. {
  291. CScrollView::Dump(dc);
  292. }
  293. CBmpTestDoc* CBmpTestView::GetDocument() // non-debug version is inline
  294. {
  295. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBmpTestDoc)));
  296. return (CBmpTestDoc*)m_pDocument;
  297. }
  298. #endif //_DEBUG
  299. /////////////////////////////////////////////////////////////////////////////
  300. // CBmpTestView message handlers
  301. void CBmpTestView::OnBtBlackness() 
  302. {
  303. // TODO: Add your command handler code here
  304. m_Rop=BLACKNESS;
  305. Invalidate();
  306. }
  307. void CBmpTestView::OnBtDstinvert() 
  308. {
  309. // TODO: Add your command handler code here
  310. m_Rop=DSTINVERT;
  311. Invalidate();
  312. }
  313. void CBmpTestView::OnBtMergecopy() 
  314. {
  315. // TODO: Add your command handler code here
  316. m_Rop=MERGECOPY;
  317. Invalidate();
  318. }
  319. void CBmpTestView::OnBtMergepaint() 
  320. {
  321. // TODO: Add your command handler code here
  322. m_Rop=MERGEPAINT;
  323. Invalidate();
  324. }
  325. void CBmpTestView::OnBtNotsrccopy() 
  326. {
  327. // TODO: Add your command handler code here
  328. m_Rop=NOTSRCCOPY;
  329. Invalidate();
  330. }
  331. void CBmpTestView::OnBtNotsrcerase() 
  332. {
  333. // TODO: Add your command handler code here
  334. m_Rop=NOTSRCERASE;
  335. Invalidate();
  336. }
  337. void CBmpTestView::OnBtPatcopy() 
  338. {
  339. // TODO: Add your command handler code here
  340. m_Rop=PATCOPY;
  341. Invalidate();
  342. }
  343. void CBmpTestView::OnBtPatinvert() 
  344. {
  345. // TODO: Add your command handler code here
  346. m_Rop=PATINVERT;
  347. Invalidate();
  348. }
  349. void CBmpTestView::OnBtPatpaint() 
  350. {
  351. // TODO: Add your command handler code here
  352. m_Rop=PATPAINT;
  353. Invalidate();
  354. }
  355. void CBmpTestView::OnBtSrcand() 
  356. {
  357. // TODO: Add your command handler code here
  358. m_Rop=SRCAND;
  359. Invalidate();
  360. }
  361. void CBmpTestView::OnBtSrccopy() 
  362. {
  363. // TODO: Add your command handler code here
  364. m_Rop=SRCCOPY;
  365. Invalidate();
  366. }
  367. void CBmpTestView::OnBtSrcerase() 
  368. {
  369. // TODO: Add your command handler code here
  370. m_Rop=SRCERASE;
  371. Invalidate();
  372. }
  373. void CBmpTestView::OnBtSrcinvert() 
  374. {
  375. // TODO: Add your command handler code here
  376. m_Rop=SRCINVERT;
  377. Invalidate();
  378. }
  379. void CBmpTestView::OnBtSrcpaint() 
  380. {
  381. // TODO: Add your command handler code here
  382. m_Rop=SRCPAINT;
  383. Invalidate();
  384. }
  385. void CBmpTestView::OnBtWhiteness() 
  386. {
  387. // TODO: Add your command handler code here
  388. m_Rop=WHITENESS;
  389. Invalidate();
  390. }
  391. void CBmpTestView::OnZftShow(CDC *pDC) 
  392. {
  393. // TODO: Add your command handler code here
  394. /* CRect rc;
  395. GetClientRect(&rc); */
  396. CBmpTestDoc* pDoc = GetDocument();
  397. ASSERT_VALID(pDoc);  
  398. if(!pDoc->m_Dib.m_BmpLoaded)
  399. {
  400. AfxMessageBox("还没有打开图像文件");
  401. return;
  402. }
  403.     int i;
  404.     long j;
  405. if (pDoc->m_Dib.BPP>=16)
  406.     {   
  407.    m_Gradmax=0;
  408.    for ( i=0;i<256;i++)
  409.    {
  410.       m_Grade_Blue[i]=0;
  411.   m_Grade_Green[i]=0;
  412.   m_Grade_Red[i]=0;
  413.    }
  414.        for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j=j+3)
  415.    {
  416.       m_Grade_Blue[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  417.   m_Grade_Green[int(*(pDoc->m_Dib.m_Buffer+j+1))]++;
  418.   m_Grade_Red[int(*(pDoc->m_Dib.m_Buffer+j+2))]++;
  419.    }
  420.        for ( i=0;i<256;i++)
  421.    {
  422.      if (m_Grade_Blue[i]>m_Gradmax)
  423. m_Gradmax=m_Grade_Blue[i];
  424.  if (m_Grade_Green[i]>m_Gradmax)
  425. m_Gradmax=m_Grade_Green[i];
  426.  if (m_Grade_Red[i]>m_Gradmax)
  427. m_Gradmax=m_Grade_Red[i];
  428.    }
  429. }
  430.     else if (pDoc->m_Dib.BPP==8)
  431. {
  432.    m_Gradmax=0;
  433.        for ( i=0;i<256;i++)
  434.    {
  435.       m_Grade[i]=0;
  436.    }
  437.        for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  438.    {
  439.       m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  440.    }
  441.    m_Gradmax=0;
  442.        for ( i=0;i<256;i++)
  443.    {
  444.      if (m_Grade[i]>m_Gradmax)
  445. m_Gradmax=m_Grade[i];
  446.    }
  447. }
  448. else
  449. {
  450.    long int black=0, white=0;
  451.    int a;
  452.    for ( i=0;i<256;i++)
  453.    {
  454.       m_Grade[i]=0;
  455.    }
  456.        for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  457.    {
  458.    a=128;
  459.        for ( i=0;i<8;i++)
  460.    {
  461.     if( ((int)*(pDoc->m_Dib.m_Buffer+j) & a)==0)
  462. black++;
  463.     else
  464. white++;
  465.     a=a>>1;
  466.    }
  467.    }
  468.    if (black>white)
  469. m_Gradmax=black;
  470.    else
  471.    m_Gradmax=white;
  472.        m_Grade[0]=black;
  473.    m_Grade[255]=white;
  474. }
  475. pDoc->m_BM=false;
  476. Invalidate();
  477. }
  478. void CBmpTestView::OnZftBalance() 
  479. {
  480. // TODO: Add your command handler code here
  481. CBmpTestDoc* pDoc = GetDocument();
  482. ASSERT_VALID(pDoc);  
  483.     int i;
  484. double m_GradAdd[256];
  485. long j;
  486.     m_GradAdd[0]=m_Grade[0];
  487. // calculate integral
  488. for ( i=1;i<256;i++)
  489. {
  490.     m_GradAdd[i]=0;
  491. }
  492. for ( i=1;i<256;i++)
  493. {
  494.     m_GradAdd[i]=m_GradAdd[i-1]+m_Grade[i];
  495. }
  496. for ( i=1;i<256;i++)
  497. {
  498.     m_GradAdd[i]=m_GradAdd[i]*255/m_GradAdd[255];
  499. }
  500. // 归一化阈值面积function
  501.     for ( j=0;j<(long int) pDoc->m_Dib.BufferSize;j++)
  502. {
  503.     *(pDoc->m_Dib.m_Buffer+j)=(int) (m_GradAdd[(*(pDoc->m_Dib.m_Buffer+j))]*255/m_GradAdd[255]);
  504. }
  505. for ( i=0;i<256;i++)
  506. {
  507.     m_Grade[i]=0;
  508. }
  509.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  510. {
  511.     m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  512. }
  513. for ( i=0;i<256;i++)
  514. {
  515.     if (m_Grade[i]>m_Gradmax)
  516. m_Gradmax=m_Grade[i];
  517. }
  518. pDoc->m_BM=false;
  519. Invalidate();
  520. }
  521. void CBmpTestView::OnImageShow() 
  522. {
  523. // TODO: Add your command handler code here
  524. CBmpTestDoc* pDoc = GetDocument();
  525. ASSERT_VALID(pDoc);  
  526. pDoc->m_BM=true;
  527. Invalidate();
  528. }
  529. void CBmpTestView::OnDtsmIn() 
  530. {
  531. // TODO: Add your command handler code here
  532. CBmpTestDoc* pDoc = GetDocument();
  533. ASSERT_VALID(pDoc);  
  534. if(pDoc->m_Dib.BPP!=8)
  535. {
  536.        AfxMessageBox( "此图像为非256色图像,目前该算子还不支持这种图像格式");
  537.    return;
  538. }
  539. float T0,u1,u2,T1,w1,w2,u;
  540. int i,decimal, sign;
  541. long j;
  542. char string[80]="二值化最佳阈值为",*string1,*string2;
  543.   for ( i=0;i<256;i++)
  544. {
  545.     m_Grade[i]=0;
  546. }
  547.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  548. {
  549.     m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  550. }
  551. u=0;
  552. for(i=0;i<256;i++)
  553. u=u+(float) i*m_Grade[i]/(int) pDoc->m_Dib.BufferSize;
  554. T0=u;T1=0;
  555.     while (fabs(T0-T1)>0.01)
  556. {
  557. w1=0;w2=0;u1=0;u2=0;
  558. for(i=0;i<=int(T0);i++)
  559. {
  560. w1=w1+m_Grade[i];
  561. u1=u1+i*m_Grade[i];
  562. }
  563. for(i=int(T0)+1;i<256;i++)
  564. {
  565. w2=w2+m_Grade[i];
  566. u2=u2+i*m_Grade[i];
  567. }
  568. T1=T0;u1=u1/w1;u2=u2/w2;T0=0.5*(u1+u2);
  569. }
  570. string2=_fcvt(T0, 0, &decimal, &sign );
  571. string1=strcat(string,string2);
  572.     AfxMessageBox(string1);
  573.     for ( j=0;j<(long int) pDoc->m_Dib.BufferSize;j++)
  574. {
  575. *(pDoc->m_Dib.m_Buffer+j)=(*(pDoc->m_Dib.m_Buffer+j)>=T0)?255:0;
  576. }
  577. }
  578. void CBmpTestView::OnDtsmShow() 
  579. {
  580. // TODO: Add your command handler code here
  581. CBmpTestView::OnImageShow();
  582. }
  583. void CBmpTestView::OnDtsmOut() 
  584. {
  585. // TODO: Add your command handler code here
  586. CBmpTestDoc* pDoc = GetDocument();
  587. ASSERT_VALID(pDoc);  
  588. float u,uT[255],w[255],sigma[255],sigmamax;
  589. int i,T,Topt;
  590. long j;
  591. char string[80]="类间方差法二值化最佳阈值为",*string1,*string2,buffer[10];
  592.   for ( i=0;i<256;i++)
  593. {
  594.     m_Grade[i]=0;
  595. }
  596.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  597. {
  598.     m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  599. }
  600. u=0;
  601. for(i=0;i<256;i++)
  602. {
  603. u=u+i*m_Grade[i];
  604. }
  605. u=u/pDoc->m_Dib.BufferSize;
  606. sigmamax=0;Topt=0;
  607. for(T=0;T<256;T++)
  608. {
  609. w[T]=0;uT[T]=0;
  610. for(i=0;i<=T;i++)
  611. {
  612. w[T]=w[T]+m_Grade[i];
  613. uT[T]=uT[T]+i*m_Grade[i];
  614. }
  615. uT[T]=uT[T]/pDoc->m_Dib.BufferSize;
  616. w[T]=w[T]/pDoc->m_Dib.BufferSize;
  617. sigma[T]=(u*w[T]-uT[T])*(u*w[T]-uT[T])/w[T]*(1-w[T]);
  618. if(sigma[T]>sigmamax)
  619. {
  620. sigmamax=sigma[T];Topt=T;
  621. }
  622. }
  623. string2=_itoa(Topt, buffer,10);
  624. string1=strcat(string,string2);
  625.     AfxMessageBox(string1);
  626. }
  627. void CBmpTestView::OnRecFilt() 
  628. {
  629. // TODO: Add your command handler code here
  630. CBmpTestDoc* pDoc = GetDocument();
  631. ASSERT_VALID(pDoc);  
  632. int i,j,image[4][4],Height,Width;
  633. //filtering
  634. Height=(int) pDoc->m_Dib.Height;
  635. Width=(int) pDoc->m_Dib.Bpl;
  636.   for (i=1;i<Height-1;i++)
  637. {
  638.     for (j=1;j<Width +1;j++)
  639. {
  640. image[2][2]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
  641. image[2][1]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
  642. image[2][3]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
  643. image[1][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
  644. image[1][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
  645. image[1][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
  646. image[3][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
  647. image[3][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
  648. image[3][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
  649. *(pDoc->m_Dib.m_Buffer+i*Width+j)=(image[1][1]+image[1][2]+image[1][3]+image[2][1]+image[2][2]+image[2][3]+image[3][1]+image[3][2]+image[3][3])/9;
  650. }
  651. }
  652. pDoc->m_BM=true;
  653. Invalidate();
  654. }
  655. /*void queue(int *im,int n)
  656. //int im[],n;
  657. {
  658. int i,j,medium;
  659. for(i=1;i<n;i++)
  660. {
  661. for(j=i+1;j<n+1;j++)
  662. {
  663. if(im(j)>im(i))
  664. {
  665. medium=im(i);
  666. im(i)=im(j);
  667. im(j)=medium;
  668. }
  669. }
  670. }
  671. }*/
  672. void CBmpTestView::OnMidFilt() 
  673. {
  674. // TODO: Add your command handler code here
  675. CBmpTestDoc* pDoc = GetDocument();
  676. ASSERT_VALID(pDoc);  
  677. BYTE * m_Buffer1;
  678. int i,Height,Width,i1,j1,j;
  679. //filtering
  680. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  681.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  682. {
  683.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  684. }
  685. if(pDoc->m_Dib.BPP==8)
  686. {
  687. int image[10],medium;
  688. Height=(int) pDoc->m_Dib.Height;
  689. Width=(int) pDoc->m_Dib.Bpl;
  690.   for (i=1;i<Height-1;i++)
  691. {
  692. for (j=1;j<Width +1;j++)
  693. {
  694. image[5]=(int) *(m_Buffer1+i*Width+j);
  695. image[4]=(int) *(m_Buffer1+i*Width+j-1);
  696. image[6]=(int) *(m_Buffer1+i*Width+j+1);
  697. image[2]=(int) *(m_Buffer1+(i-1)*Width+j);
  698. image[1]=(int) *(m_Buffer1+(i-1)*Width+j-1);
  699. image[3]=(int) *(m_Buffer1+(i-1)*Width+j+1);
  700. image[8]=(int) *(m_Buffer1+(i+1)*Width+j);
  701. image[7]=(int) *(m_Buffer1+(i+1)*Width+j-1);
  702. image[9]=(int) *(m_Buffer1+(i+1)*Width+j+1);
  703.          for(i1=1;i1<9;i1++)
  704. {
  705.          for(j1=i1+1;j1<10;j1++)
  706. {
  707.      if(image[j1]>image[i1])
  708. {
  709.      medium=image[i1];
  710.          image[i1]=image[j1];
  711.          image[j1]=medium;
  712. }
  713. }
  714. }
  715. *(pDoc->m_Dib.m_Buffer+i*Width+j)=image[5];
  716. }
  717. }
  718. }
  719. else
  720. {
  721. // 24位彩色中值滤波
  722. int image[10][4],medium[4],k;
  723. Height=(int) pDoc->m_Dib.Height;
  724. Width=(int) pDoc->m_Dib.Bpl;
  725.   for (i=1;i<Height-1;i++)
  726. {
  727. for (j=1;j<(int)Width/3 ;j++)
  728. {
  729. for(k=0;k<3;k++)
  730. {
  731. image[5][k+1]=(int) *(m_Buffer1+i*Width+j*3+k);
  732. image[4][k+1]=(int) *(m_Buffer1+i*Width+(j-1)*3+k);
  733. image[6][k+1]=(int) *(m_Buffer1+i*Width+(j+1)*3+k);
  734. image[2][k+1]=(int) *(m_Buffer1+(i-1)*Width+j*3+k);
  735. image[1][k+1]=(int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
  736. image[3][k+1]=(int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
  737. image[8][k+1]=(int) *(m_Buffer1+(i+1)*Width+j*3+k);
  738. image[7][k+1]=(int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
  739. image[9][k+1]=(int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
  740. }
  741. //冒泡排序
  742. for(i1=1;i1<9;i1++)
  743. {
  744.          for(j1=i1+1;j1<10;j1++)
  745. {
  746.      if((image[j1][1]+image[j1][2]+image[j1][3])/3>(image[i1][1]+image[i1][2]+image[i1][3])/3)
  747. {
  748. for(k=1;k<4;k++)
  749. {
  750.      medium[k]=image[i1][k];
  751. image[i1][k]=image[j1][k];
  752. image[j1][k]=medium[k];
  753. }
  754. }
  755. }
  756. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=image[5][1];
  757. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=image[5][2];
  758. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=image[5][3];
  759. }
  760. }
  761. }
  762. }
  763. if(m_Buffer1)
  764. {
  765. delete [] m_Buffer1;
  766. m_Buffer1=0;
  767. }
  768. pDoc->m_BM=true;
  769. Invalidate();
  770. }
  771. void CBmpTestView::OnEdgeRobert() 
  772. {
  773. // TODO: Add your command handler code here
  774. #include  <math.h>
  775. CBmpTestDoc* pDoc = GetDocument();
  776. ASSERT_VALID(pDoc);
  777. if(pDoc->m_Dib.BPP>8)
  778. {
  779. AfxMessageBox("该算子不能处理8位图像");
  780. return;
  781. }
  782. BYTE * m_Buffer1;
  783. int i,j,image[10],Height,Width,a,b;
  784. //filtering
  785. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  786.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  787. {
  788.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  789. }
  790. Height=(int) pDoc->m_Dib.Height;
  791. Width=(int) pDoc->m_Dib.Bpl;
  792.   for (i=1;i<Height-1;i++)
  793. {
  794.     for (j=1;j<Width -1;j++)
  795. {
  796. image[1]=(unsigned int) *(m_Buffer1+(i-1)*Width+j-1);
  797. image[3]=(unsigned int) *(m_Buffer1+(i-1)*Width+j+1);
  798. image[7]=(unsigned int) *(m_Buffer1+(i+1)*Width+j-1);
  799. image[9]=(unsigned int) *(m_Buffer1+(i+1)*Width+j+1);
  800.             a=abs(image[1]-image[9]);
  801. b=abs(image[3]-image[7]);
  802. *(pDoc->m_Dib.m_Buffer+i*Width+j)=((a>b)?a:b);
  803. }
  804. }
  805. if(m_Buffer1)
  806. {
  807. delete [] m_Buffer1;
  808. m_Buffer1=0;
  809. }
  810. pDoc->m_BM=true;
  811. Invalidate();
  812. }
  813. void CBmpTestView::OnEdgeLaplace() 
  814. {
  815. // TODO: Add your command handler code here
  816. CBmpTestDoc* pDoc = GetDocument();
  817. ASSERT_VALID(pDoc);  
  818. if(pDoc->m_Dib.BPP>8)
  819. {
  820. AfxMessageBox("该算子只能处理8位图像");
  821. return;
  822. }
  823. int i,j,image[10],Height,Width,a;
  824. //filtering
  825. Height=(int) pDoc->m_Dib.Height;
  826. Width=(int) pDoc->m_Dib.Bpl;
  827. // Total=(int) pDoc->m_Dib.BufferSize;
  828.   for (i=1;i<Height-1;i++)
  829. {
  830.     for (j=1;j<Width +1;j++)
  831. {
  832. image[5]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
  833. image[4]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
  834. image[6]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
  835. image[2]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
  836. image[1]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
  837. image[3]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
  838. image[8]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
  839. image[7]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
  840. image[9]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
  841. a=image[2]+image[4]+image[6]+image[8]-4*image[5];
  842. *(pDoc->m_Dib.m_Buffer+i*Width+j)=((a>0)?a:0);
  843. }
  844. }
  845. pDoc->m_BM=true;
  846. Invalidate();
  847. }
  848. void CBmpTestView::OnGauseFilt() 
  849. {
  850. // TODO: Add your command handler code here
  851. CBmpTestDoc* pDoc = GetDocument();
  852. ASSERT_VALID(pDoc);  
  853. if(pDoc->m_Dib.BPP>8)
  854. {
  855. AfxMessageBox("该算子只能处理8位图像");
  856. return;
  857. }
  858. int i,j,image[4][4],Height,Width;
  859. double a0,a1,a2;
  860. a0=1/sqrt(2*3.14);
  861. a1=0.6065/sqrt(2*3.14);
  862. a2=exp(-1)/sqrt(2*3.14);
  863. //filtering
  864. Height=(int) pDoc->m_Dib.Height;
  865. Width=(int) pDoc->m_Dib.Bpl;
  866.   for (i=1;i<Height-1;i++)
  867. {
  868.     for (j=1;j<Width +1;j++)
  869. {
  870. image[2][2]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
  871. image[2][1]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
  872. image[2][3]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
  873. image[1][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
  874. image[1][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
  875. image[1][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
  876. image[3][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
  877. image[3][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
  878. image[3][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
  879. *(pDoc->m_Dib.m_Buffer+i*Width+j)=(int)(image[1][1]*a2+image[1][2]*a1+image[1][3]*a2+image[2][1]*a1+image[2][2]*a0+image[2][3]*a1+image[3][1]*a2+image[3][2]*a1+image[3][3]*a2);
  880. }
  881. }
  882. pDoc->m_BM=true;
  883. Invalidate();
  884. }
  885. void CBmpTestView::OnEdgeMarr() 
  886. {
  887. // TODO: Add your command handler code here
  888. OnGauseFilt();
  889. OnEdgeLaplace();
  890. }
  891. void CBmpTestView::OnStruAdd() 
  892. {
  893. // 二值形态学:膨胀,结构和
  894. CBmpTestDoc* pDoc = GetDocument();
  895. ASSERT_VALID(pDoc);  
  896. int i,j,image[4][4],Height,Width,a,k;
  897. //filtering
  898. Height=(int) pDoc->m_Dib.Height;
  899. Width=(int) pDoc->m_Dib.Bpl;
  900. BYTE * m_Buffer1;
  901. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  902.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  903. {
  904.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  905. }
  906. m_Gradmax=0;
  907.     for ( i=0;i<256;i++)
  908. {
  909.     m_Grade[i]=0;
  910. }
  911.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  912. {
  913.     m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  914. }
  915. m_Gradmax=0;
  916.     for ( i=1;i<256;i++)
  917. {
  918.    if (m_Grade[i]>m_Gradmax)
  919.    {
  920.   m_Gradmax=m_Grade[i];
  921.   k=i;
  922.    }
  923. }
  924.   for (i=1;i<Height-1;i++)
  925. {
  926.     for (j=1;j<Width +1;j++)
  927. {
  928. image[2][2]=(unsigned int) *(m_Buffer1+i*Width+j);
  929. image[2][1]=(unsigned int) *(m_Buffer1+i*Width+j-1);
  930. image[2][3]=(unsigned int) *(m_Buffer1+i*Width+j+1);
  931. image[1][2]=(unsigned int) *(m_Buffer1+(i-1)*Width+j);
  932. image[1][1]=(unsigned int) *(m_Buffer1+(i-1)*Width+j-1);
  933. image[1][3]=(unsigned int) *(m_Buffer1+(i-1)*Width+j+1);
  934. image[3][2]=(unsigned int) *(m_Buffer1+(i+1)*Width+j);
  935. image[3][1]=(unsigned int) *(m_Buffer1+(i+1)*Width+j-1);
  936. image[3][3]=(unsigned int) *(m_Buffer1+(i+1)*Width+j+1);
  937. a=image[1][1]||image[1][2]||image[1][3]||image[2][1]||image[2][2]||image[2][3]||image[3][1]||image[3][2]||image[3][3];
  938. *(pDoc->m_Dib.m_Buffer+i*Width+j)=(a?k:0);
  939. }
  940. }
  941. if(m_Buffer1)
  942. {
  943. delete [] m_Buffer1;
  944. m_Buffer1=0;
  945. }
  946. pDoc->m_BM=true;
  947. Invalidate();
  948. }
  949. void CBmpTestView::OnStruSub() 
  950. {
  951. // TODO: Add your command handler code here
  952. CBmpTestDoc* pDoc = GetDocument();
  953. ASSERT_VALID(pDoc);  
  954. int i,j,image[4][4],Height,Width,a,k;
  955. //filtering
  956. Height=(int) pDoc->m_Dib.Height;
  957. Width=(int) pDoc->m_Dib.Bpl;
  958. //如下代码可防止不同图像调色板的不同
  959. BYTE * m_Buffer1;
  960. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  961.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  962. {
  963.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  964. }
  965. m_Gradmax=0;
  966.     for ( i=0;i<256;i++)
  967. {
  968.     m_Grade[i]=0;
  969. }
  970.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  971. {
  972.     m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  973. }
  974. m_Gradmax=0;
  975.     for ( i=1;i<256;i++)
  976. {
  977.    if (m_Grade[i]>m_Gradmax)
  978.    {
  979.   m_Gradmax=m_Grade[i];
  980.   k=i;
  981.    }
  982. }
  983.   for (i=1;i<Height-1;i++)
  984. {
  985.     for (j=1;j<Width +1;j++)
  986. {
  987. image[2][2]=(int) *(m_Buffer1+i*Width+j);
  988. image[2][1]=(int) *(m_Buffer1+i*Width+j-1);
  989. image[2][3]=(int) *(m_Buffer1+i*Width+j+1);
  990. image[1][2]=(int) *(m_Buffer1+(i-1)*Width+j);
  991. image[1][1]=(int) *(m_Buffer1+(i-1)*Width+j-1);
  992. image[1][3]=(int) *(m_Buffer1+(i-1)*Width+j+1);
  993. image[3][2]=(int) *(m_Buffer1+(i+1)*Width+j);
  994. image[3][1]=(int) *(m_Buffer1+(i+1)*Width+j-1);
  995. image[3][3]=(int) *(m_Buffer1+(i+1)*Width+j+1);
  996. a=image[1][1]&&image[1][2]&&image[1][3]&&image[2][1]&&image[2][2]&&image[2][3]&&image[3][1]&&image[3][2]&&image[3][3];
  997. *(pDoc->m_Dib.m_Buffer+i*Width+j)=(a?k:0);
  998. }
  999. }
  1000. if(m_Buffer1)
  1001. {
  1002. delete [] m_Buffer1;
  1003. m_Buffer1=0;
  1004. }
  1005. pDoc->m_BM=true;
  1006. Invalidate();
  1007. }
  1008. void CBmpTestView::OnStruOpen() 
  1009. {
  1010. // TODO: Add your command handler code here
  1011. OnStruSub();
  1012. OnStruAdd();
  1013. }
  1014. void CBmpTestView::OnStruClose() 
  1015. {
  1016. // TODO: Add your command handler code here
  1017. OnStruAdd();
  1018. OnStruSub();
  1019. }
  1020. void CBmpTestView::OnEditBackup() 
  1021. {
  1022. // TODO: Add your command handler code here
  1023. CBmpTestDoc* pDoc = GetDocument();
  1024. ASSERT_VALID(pDoc);  
  1025.     pDoc->m_Dib.restoreimage();
  1026. pDoc->m_BM=true;
  1027. Invalidate();
  1028. }
  1029. void CBmpTestView::OnEditBlue() 
  1030. {
  1031. // TODO: Add your command handler code here
  1032. CBmpTestDoc* pDoc = GetDocument();
  1033. ASSERT_VALID(pDoc);
  1034. if(pDoc->m_Dib.BPP<=8)
  1035. {
  1036.        AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
  1037.    return;
  1038. }
  1039. if(pDoc->m_Dib.GetBlueImg())
  1040. Invalidate();
  1041. }
  1042. void CBmpTestView::OnEditGreen() 
  1043. {
  1044. // TODO: Add your command handler code here
  1045. CBmpTestDoc* pDoc = GetDocument();
  1046. ASSERT_VALID(pDoc);  
  1047. if(pDoc->m_Dib.BPP<=8)
  1048. {
  1049.        AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
  1050.    return;
  1051. }
  1052. if(pDoc->m_Dib.GetGreenImg())
  1053. Invalidate();
  1054. }
  1055. void CBmpTestView::OnEditRed() 
  1056. {
  1057. // TODO: Add your command handler code here
  1058. CBmpTestDoc* pDoc = GetDocument();
  1059. ASSERT_VALID(pDoc);  
  1060. if(pDoc->m_Dib.BPP<=8)
  1061. {
  1062.        AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
  1063.    return;
  1064. }
  1065. if(pDoc->m_Dib.GetRedImg())
  1066. Invalidate();
  1067. }
  1068. void CBmpTestView::OnEdgeColorprewitt() 
  1069. {
  1070. // TODO: 一种强有力的非线性算子,加强了纵向,但也造成横向断裂
  1071. # include <math.h>
  1072. CBmpTestDoc* pDoc = GetDocument();
  1073. ASSERT_VALID(pDoc);  
  1074. if(pDoc->m_Dib.BPP<=8)
  1075. {
  1076.        AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
  1077.    return;
  1078. }
  1079. int i,j,k,image[10][4],Height,Width;
  1080. unsigned int a;
  1081. BYTE * m_Buffer1;
  1082. double e1,e2,e3;
  1083. //filtering
  1084. Height=(int) pDoc->m_Dib.Height;
  1085. Width=(int) pDoc->m_Dib.Bpl;
  1086. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1087.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1088. {
  1089.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1090. }
  1091.   for (i=1;i<Height-1;i++)
  1092. {
  1093.     for (j=1;j<(int)Width/3 -1;j++)
  1094. {
  1095. for (k=0;k<3;k++)
  1096. {
  1097. image[1][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
  1098. image[3][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
  1099. image[4][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j-1)*3+k);
  1100. image[6][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j+1)*3+k);
  1101. image[7][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
  1102. image[9][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
  1103. }
  1104.             e1=sqrt(pow((image[1][1]-image[3][1]),2)+pow((image[1][2]-image[3][2]),2)+pow((image[1][3]-image[3][3]),2));
  1105. e2=sqrt(pow((image[4][1]-image[6][1]),2)+pow((image[4][2]-image[6][2]),2)+pow((image[4][3]-image[6][3]),2));
  1106. e3=sqrt(pow((image[7][1]-image[9][1]),2)+pow((image[7][2]-image[9][2]),2)+pow((image[7][3]-image[9][3]),2));
  1107. a=(unsigned int)(e1+e2+e3);
  1108. a=((a>255)?255:a);
  1109. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
  1110. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
  1111. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
  1112. }
  1113. }
  1114. if(m_Buffer1)
  1115. {
  1116. delete [] m_Buffer1;
  1117. m_Buffer1=0;
  1118. }
  1119. pDoc->m_BM=true;
  1120. Invalidate();
  1121. }
  1122. void CBmpTestView::OnEdgeColorrobert() 
  1123. {
  1124. // TODO: 一种强烈的非线性算子,加强了双45度方向,保持了字符笔划的完整性
  1125. # include <math.h>
  1126. CBmpTestDoc* pDoc = GetDocument();
  1127. ASSERT_VALID(pDoc);  
  1128. if(pDoc->m_Dib.BPP<=8)
  1129. {
  1130.        AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
  1131.    return;
  1132. }
  1133. int i,j,k,image[10][4],Height,Width;
  1134. unsigned int a;
  1135. BYTE * m_Buffer1;
  1136. double e2,e1;
  1137. //filtering
  1138. Height=(int) pDoc->m_Dib.Height;
  1139. Width=(int) pDoc->m_Dib.Bpl;
  1140. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1141.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1142. {
  1143.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1144. }
  1145.   for (i=1;i<Height-1;i++)
  1146. {
  1147.     for (j=1;j<(int)Width/3 -1;j++)
  1148. {
  1149. for (k=0;k<3;k++)
  1150. {
  1151. image[1][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
  1152. image[3][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
  1153. image[7][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
  1154. image[9][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
  1155. }
  1156.             e1=pow((image[1][1]-image[9][1]),2)+pow((image[1][2]-image[9][2]),2)+pow((image[1][3]-image[9][3]),2);
  1157. e2=pow((image[3][1]-image[7][1]),2)+pow((image[3][2]-image[7][2]),2)+pow((image[3][3]-image[7][3]),2);
  1158. a=(unsigned int)sqrt(e1+e2);
  1159. a=((a>255)?255:a);
  1160. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
  1161. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
  1162. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
  1163. }
  1164. }
  1165. if(m_Buffer1)
  1166. {
  1167. delete [] m_Buffer1;
  1168. m_Buffer1=0;
  1169. }
  1170. pDoc->m_BM=true;
  1171. Invalidate();
  1172. }
  1173. void CBmpTestView::OnMidFiltLine() 
  1174. {
  1175. // TODO: Add your command handler code here
  1176. CBmpTestDoc* pDoc = GetDocument();
  1177. ASSERT_VALID(pDoc);  
  1178. BYTE * m_Buffer1;
  1179. int i,Height,Width,i1,j1,j;
  1180. //filtering
  1181. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1182.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1183. {
  1184.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1185. }
  1186. if(pDoc->m_Dib.BPP==8)
  1187. {
  1188. int image[6],medium;
  1189. Height=(int) pDoc->m_Dib.Height;
  1190. Width=(int) pDoc->m_Dib.Bpl;
  1191. for (j=0;j<Width +1;j++)
  1192. {
  1193.   for (i=2;i<Height-2;i++)
  1194. {
  1195. image[3]=(int) *(m_Buffer1+i*Width+j);
  1196. image[2]=(int) *(m_Buffer1+(i-1)*Width+j);
  1197. image[4]=(int) *(m_Buffer1+(i+1)*Width+j);
  1198. image[1]=(int) *(m_Buffer1+(i-2)*Width+j);
  1199. image[5]=(int) *(m_Buffer1+(i+2)*Width+j);
  1200. //冒泡排序
  1201. for(i1=1;i1<5;i1++)
  1202. {
  1203.          for(j1=i1+1;j1<6;j1++)
  1204. {
  1205.      if(image[j1]>image[i1])
  1206. {
  1207.      medium=image[i1];
  1208.          image[i1]=image[j1];
  1209.          image[j1]=medium;
  1210. }
  1211. }
  1212. }
  1213. *(pDoc->m_Dib.m_Buffer+i*Width+j)=image[3];
  1214. }
  1215. }
  1216. }
  1217. else
  1218. {
  1219. // 24位彩色中值滤波
  1220. int image[6][4],medium[4],k;
  1221. Height=(int) pDoc->m_Dib.Height;
  1222. Width=(int) pDoc->m_Dib.Bpl;
  1223. for (j=0;j<(int)Width/3;j++)
  1224. {
  1225.   for (i=2;i<Height-2;i++)
  1226. {
  1227. for(k=0;k<3;k++)
  1228. {
  1229. image[3][k+1]=(int) *(m_Buffer1+i*Width+j*3+k);
  1230. image[2][k+1]=(int) *(m_Buffer1+(i-1)*Width+j*3+k);
  1231. image[4][k+1]=(int) *(m_Buffer1+(i+1)*Width+j*3+k);
  1232. image[1][k+1]=(int) *(m_Buffer1+(i-2)*Width+j*3+k);
  1233. image[5][k+1]=(int) *(m_Buffer1+(i+2)*Width+j*3+k);
  1234. }
  1235. //冒泡排序
  1236. for(i1=1;i1<5;i1++)
  1237. {
  1238.          for(j1=i1+1;j1<6;j1++)
  1239. {
  1240.      if((image[j1][1]+image[j1][2]+image[j1][3])/3>(image[i1][1]+image[i1][2]+image[i1][3])/3)
  1241. {
  1242. for(k=1;k<4;k++)
  1243. {
  1244.      medium[k]=image[i1][k];
  1245. image[i1][k]=image[j1][k];
  1246. image[j1][k]=medium[k];
  1247. }
  1248. }
  1249. }
  1250. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=image[3][1];
  1251. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=image[3][2];
  1252. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=image[3][3];
  1253. }
  1254. }
  1255. }
  1256. }
  1257. if(m_Buffer1)
  1258. {
  1259. delete [] m_Buffer1;
  1260. m_Buffer1=0;
  1261. }
  1262. pDoc->m_BM=true;
  1263. Invalidate();
  1264. }
  1265. void CBmpTestView::OnDensityScan() 
  1266. {
  1267. // TODO: Add your command handler code here
  1268. CBmpTestDoc* pDoc = GetDocument();
  1269. ASSERT_VALID(pDoc);  
  1270. # include <math.h>
  1271. int i,j,Height,Width;
  1272. if(pDoc->m_Dib.BPP==8)
  1273. return;
  1274. Height=(int) pDoc->m_Dib.Height;
  1275. Width=(int) pDoc->m_Dib.Bpl;
  1276. int image[2048][4],b[2048],count;
  1277. double diff;
  1278. //扫描从图像底部开始
  1279. for (i=0;i<Height;i++)
  1280. {
  1281. for(j=0;j<(int)Width/3;j++)
  1282. {
  1283. image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
  1284. image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
  1285. image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
  1286. if(image[j][1]<60)
  1287. {
  1288. image[j][1]=0;
  1289. image[j][2]=0;
  1290. image[j][3]=0;
  1291. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1292. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1293. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1294. }
  1295. j=0;
  1296. count=0;
  1297. while (j<(int)Width/3)
  1298. {
  1299. //因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
  1300. diff=abs(image[j][1]-image[j+1][1])*1.7;
  1301. b[j]=(((int)diff>150)?1:0);
  1302. count+=b[j];
  1303. j++;
  1304. }
  1305. //变化15次已是最高限了,再高就会使车牌出现空线
  1306. if (count<15) 
  1307. {
  1308.      for(j=0;j<(int)Width/3;j++)
  1309. {
  1310. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1311. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1312. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1313. }
  1314. }
  1315. else
  1316. {
  1317. //分区域扫描法
  1318. count=0;
  1319. //第一节
  1320. for(j=0;j<(int)Width/45;j++)
  1321. count+=b[j];
  1322. //剩余部分的简化算法
  1323. do
  1324. {
  1325. //变化6次是最佳经验值
  1326. if(count<4)
  1327. {
  1328. *(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3)=0;
  1329. *(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3+1)=0;
  1330. *(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3+2)=0;
  1331. }
  1332. count=count+b[j]-b[j-(int)Width/45];
  1333. j++;
  1334. }while(j<(int)Width/3);
  1335. for(j=j-(int)Width/45;j<(int)Width/3;j++)
  1336. {
  1337. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1338. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1339. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1340. //进一步扫描,消除图像中的残留点
  1341. for(j=0;j<(int)Width/3;j++)
  1342. {
  1343. image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
  1344. j=0;
  1345. count=0;
  1346. while (j<(int)Width/3)
  1347. {
  1348. //因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
  1349. diff=abs(image[j][1]-image[j+1][1])*1.7;
  1350. b[j]=(((int)diff>220)?1:0);
  1351. count+=b[j];
  1352. j++;
  1353. }
  1354. //变化3次已是最高限了,再高就会使车牌出现空线
  1355. if (count<8) 
  1356. {
  1357.      for(j=0;j<(int)Width/3;j++)
  1358. {
  1359. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1360. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1361. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1362. }
  1363.   for (i=Height-5;i<Height;i++)
  1364. {
  1365.     for (j=0;j<(int)Width/3 ;j++)
  1366. {
  1367. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1368. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1369. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1370. }
  1371. //反向扫描
  1372. for (i=0;i<Height;i++)
  1373. {
  1374.     for (j=0;j<(int)Width/3 ;j++)
  1375. {
  1376. image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
  1377. image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
  1378. image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
  1379. j=(int)Width/3;
  1380. while (j>=1)
  1381. {
  1382. //因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
  1383. diff=abs(image[j][1]-image[j-1][1])*1.7;
  1384. b[j]=(((int)diff>60)?1:0);
  1385. j--;
  1386. }
  1387. //变化15次已是最高限了,再高就会使车牌出现空线
  1388. //分区域扫描法
  1389. count=0;
  1390. //第一节
  1391. for(j=(int)Width/3-1;j>=(int)Width/3-(int)Width/45;j--)
  1392. count+=b[j];
  1393. //剩余部分的简化算法
  1394. do
  1395. {
  1396. //变化6次是最佳经验值
  1397. if(count<4)
  1398. {
  1399. *(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3)=0;
  1400. *(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3+1)=0;
  1401. *(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3+2)=0;
  1402. }
  1403. count=count+b[j]-b[j+(int)Width/45];
  1404. j--;
  1405. }while(j>=1); 
  1406. pDoc->m_BM=true;
  1407. Invalidate();
  1408. }
  1409. void CBmpTestView::OnRowDilation() 
  1410. {
  1411. // TODO: Add your command handler code here
  1412. // 形态学:横向膨胀,结构和,两边各扩展6个像素
  1413. CBmpTestDoc* pDoc = GetDocument();
  1414. ASSERT_VALID(pDoc);  
  1415. if(pDoc->m_Dib.BPP==8)
  1416. return;
  1417. int i,j,i1,j1,Height,Width,a;
  1418. Height=(int) pDoc->m_Dib.Height;
  1419. Width=(int) pDoc->m_Dib.Bpl;
  1420. BYTE * m_Buffer1;
  1421. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1422.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1423. {
  1424.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1425. }
  1426.   for (i=2;i<Height-3;i++)
  1427. {
  1428.     for (j=4;j<(int)Width/3-5;j++)
  1429. {
  1430. a=0;
  1431. for (i1=-2;i1<3;i1++)
  1432. {
  1433. for(j1=-4;j1<5;j1++)
  1434. {
  1435. if ((unsigned int) *(m_Buffer1+(i+i1)*Width+(j+j1)*3)>50)
  1436. a=1;
  1437. }
  1438. }
  1439. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=(a?255:0);
  1440. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=(a?255:0);
  1441. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=(a?255:0);
  1442. }
  1443. }
  1444. if(m_Buffer1)
  1445. {
  1446. delete [] m_Buffer1;
  1447. m_Buffer1=0;
  1448. }
  1449. pDoc->m_BM=true;
  1450. Invalidate();
  1451. }
  1452. void CBmpTestView::OnEdgeColorprewitt1() 
  1453. {
  1454. // TODO: Add your command handler code here
  1455. # include <math.h>
  1456. CBmpTestDoc* pDoc = GetDocument();
  1457. ASSERT_VALID(pDoc);  
  1458. if(pDoc->m_Dib.BPP<=8)
  1459. {
  1460.        AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
  1461.    return;
  1462. }
  1463. int i,j,k,image[5][4],Height,Width;
  1464. unsigned int a;
  1465. BYTE * m_Buffer1;
  1466. double e1,e2;
  1467. //filtering
  1468. Height=(int) pDoc->m_Dib.Height;
  1469. Width=(int) pDoc->m_Dib.Bpl;
  1470. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1471.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1472. {
  1473.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1474. }
  1475.   for (i=0;i<Height-1;i++)
  1476. {
  1477.     for (j=0;j<(int)Width/3 -1;j++)
  1478. {
  1479. for (k=0;k<3;k++)
  1480. {
  1481. image[1][k+1]=(unsigned int) *(m_Buffer1+i*Width+j*3+k);
  1482. image[2][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j+1)*3+k);
  1483. image[3][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+j*3+k);
  1484. image[4][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
  1485. }
  1486.             e1=sqrt(pow((image[1][1]-image[2][1]),2)+pow((image[1][2]-image[2][2]),2)+pow((image[1][3]-image[2][3]),2));
  1487. e2=sqrt(pow((image[3][1]-image[4][1]),2)+pow((image[3][2]-image[4][2]),2)+pow((image[3][3]-image[4][3]),2));
  1488. a=(unsigned int)(e1+e2);
  1489. a=((a>255)?255:a);
  1490. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
  1491. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
  1492. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
  1493. }
  1494. }
  1495. if(m_Buffer1)
  1496. {
  1497. delete [] m_Buffer1;
  1498. m_Buffer1=0;
  1499. }
  1500. pDoc->m_BM=true;
  1501. Invalidate();
  1502. }
  1503. void CBmpTestView::OnEdgeColorrobert1() 
  1504. {
  1505. // TODO: Add your command handler code here
  1506. #include <math.h>
  1507. CBmpTestDoc* pDoc = GetDocument();
  1508. ASSERT_VALID(pDoc);  
  1509. if(pDoc->m_Dib.BPP<=8)
  1510. {
  1511.        AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
  1512.    return;
  1513. }
  1514. int i,j,k,image[5][4],Height,Width;
  1515. unsigned int a;
  1516. BYTE * m_Buffer1;
  1517. double e2,e1;
  1518. //filtering
  1519. Height=(int) pDoc->m_Dib.Height;
  1520. Width=(int) pDoc->m_Dib.Bpl;
  1521. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1522.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1523. {
  1524.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1525. }
  1526.   for (i=0;i<Height-1;i++)
  1527. {
  1528.     for (j=0;j<(int)Width/3 -1;j++)
  1529. {
  1530. for (k=0;k<3;k++)
  1531. {
  1532. image[1][k+1]=(unsigned int) *(m_Buffer1+i*Width+j*3+k);
  1533. image[2][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j+1)*3+k);
  1534. image[3][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+j*3+k);
  1535. image[4][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
  1536. }
  1537.             e1=sqrt(pow((image[1][1]-image[4][1]),2)+pow((image[1][2]-image[4][2]),2)+pow((image[1][3]-image[4][3]),2));
  1538. e2=sqrt(pow((image[2][1]-image[3][1]),2)+pow((image[2][2]-image[3][2]),2)+pow((image[2][3]-image[3][3]),2));
  1539. a=(unsigned int)(e1+e2);
  1540. a=((a>255)?255:a);
  1541. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
  1542. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
  1543. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
  1544. }
  1545. }
  1546. if(m_Buffer1)
  1547. {
  1548. delete [] m_Buffer1;
  1549. m_Buffer1=0;
  1550. }
  1551. pDoc->m_BM=true;
  1552. Invalidate();
  1553. }
  1554. void CBmpTestView::OnRowErosion() 
  1555. {
  1556. // TODO: Add your command handler code here
  1557. // 形态学:横向收缩,结构差,两边各收缩4个像素
  1558. CBmpTestDoc* pDoc = GetDocument();
  1559. ASSERT_VALID(pDoc);  
  1560. if(pDoc->m_Dib.BPP==8)
  1561. return;
  1562. int i,j,i1,j1,Height,Width,a;
  1563. Height=(int) pDoc->m_Dib.Height;
  1564. Width=(int) pDoc->m_Dib.Bpl;
  1565. BYTE * m_Buffer1;
  1566. m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
  1567.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1568. {
  1569.     *(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
  1570. }
  1571.   for (i=2;i<Height-3;i++)
  1572. {
  1573.     for (j=4;j<(int)Width/3-5;j++)
  1574. {
  1575. a=0;
  1576. for (i1=-2;i1<3;i1++)
  1577. {
  1578. for(j1=-4;j1<5;j1++)
  1579. {
  1580. if ((unsigned int) *(m_Buffer1+(i+i1)*Width+(j+j1)*3)<50)
  1581. a=1;
  1582. }
  1583. }
  1584. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=(a?0:255);
  1585. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=(a?0:255);
  1586. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=(a?0:255);
  1587. }
  1588. }
  1589. if(m_Buffer1)
  1590. {
  1591. delete [] m_Buffer1;
  1592. m_Buffer1=0;
  1593. }
  1594. pDoc->m_BM=true;
  1595. Invalidate();
  1596. }
  1597. void CBmpTestView::OnClose() 
  1598. {
  1599. // TODO: Add your command handler code here
  1600. OnRowDilation();
  1601. OnRowDilation();
  1602. OnRowErosion();
  1603. // OnRowDilation();
  1604. }
  1605. void CBmpTestView::OnGet() 
  1606. {
  1607. // TODO: Add your command handler code here
  1608. CBmpTestDoc* pDoc = GetDocument();
  1609. ASSERT_VALID(pDoc);  
  1610. if(pDoc->m_Dib.BPP==8)
  1611. return;
  1612. int j;
  1613.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  1614. {
  1615.     *(pDoc->m_Dib.m_Buffer+j)=(*(pDoc->m_Dib.m_Buffer+j))&(*(pDoc->m_Dib.m_Buffer1+j));
  1616. }
  1617. pDoc->m_BM=true;
  1618. Invalidate();
  1619. }
  1620. void CBmpTestView::OnRelaScan() 
  1621. {
  1622. // TODO: Add your command handler code here
  1623. CBmpTestDoc* pDoc = GetDocument();
  1624. ASSERT_VALID(pDoc);  
  1625. # include <math.h>
  1626. int i,j,i1,j1,Height,Width;
  1627. //    char s[15]="";
  1628. if(pDoc->m_Dib.BPP==8)
  1629. return;
  1630. Height=(int) pDoc->m_Dib.Height;
  1631. Width=(int) pDoc->m_Dib.Bpl;
  1632. int image[1024],count;
  1633. double diff;
  1634. CString strr,s;
  1635. LPCTSTR fn;
  1636. CFileDialog fd(FALSE,
  1637.    NULL,
  1638.    NULL,
  1639.    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  1640.    "data files(*.dat)|*.dat|All files(*.*)|*.*||"
  1641.    );
  1642. if(fd.DoModal()==IDOK)
  1643. {
  1644. strr=fd.GetPathName();
  1645. if(strr.Find(".dat")==-1)
  1646. {
  1647. strr=strr+".dat";
  1648. }
  1649. }
  1650. fn=strr.GetBuffer(100);
  1651. if(fn=="")
  1652. {
  1653. return;
  1654. }
  1655. FILE * fp;
  1656. if((fp=fopen(fn,"wb"))==NULL)
  1657. {
  1658. return;
  1659. }
  1660. //扫描从图像底部开始
  1661. for (i=0;i<Height;i++)
  1662. {
  1663. for(j=0;j<(int)Width/3;j++)
  1664. {
  1665. image[j]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
  1666. if(image[j]<60)
  1667. {
  1668. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1669. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1670. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1671. }
  1672. j=0;
  1673. count=0;
  1674. while (j<(int)Width/3)
  1675. {
  1676. //因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
  1677. diff=abs(image[j]-image[j+1])*1.7;
  1678. b[i][j]=(((int)diff>150)?1:0);
  1679. count+=b[i][j];
  1680. j++;
  1681. }
  1682. //变化15次已是最高限了,再高就会使车牌出现空线
  1683. if (count<15) 
  1684. {
  1685.      for(j=0;j<(int)Width/3;j++)
  1686. {
  1687. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1688. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1689. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1690. }
  1691. }
  1692. //将模板内计数并存入文件中以观查
  1693. for (i=(int)Width/144;i<Height-(int)Width/144;i++)  //车牌纵横比约为3:1
  1694. {
  1695. for(j=(int)Width/48;j<(int)5*Width/16;j++)   //模板大小取车牌最小值,图像宽度的1/8
  1696. {
  1697. //   str(b[i][j],s);   我的数字——>字符串函数,优点是速度快
  1698. count=0;
  1699. for(i1=i-(int)Width/144;i1<i+(int)Width/144;i1++)
  1700. {
  1701. for(j1=j-(int)Width/48;j1<j+(int)Width/48;j1++)
  1702. count+=b[i1][j1];
  1703. }
  1704. s.Format("%d",count);
  1705.     fprintf(fp,"%s ",s); 
  1706. }
  1707.         fprintf(fp,"n"); 
  1708. }
  1709. pDoc->m_BM=true;
  1710. Invalidate();
  1711. fclose(fp);
  1712. }
  1713. void CBmpTestView::OnDensityScanMid() 
  1714. {
  1715. // TODO: Add your command handler code here
  1716. CBmpTestDoc* pDoc = GetDocument();
  1717. ASSERT_VALID(pDoc);  
  1718. # include <math.h>
  1719. int i,j,Height,Width;
  1720. if(pDoc->m_Dib.BPP==8)
  1721. return;
  1722. Height=(int) pDoc->m_Dib.Height;
  1723. Width=(int) pDoc->m_Dib.Bpl;
  1724. int image[2048][4],b[2048],count;
  1725. double diff;
  1726. //扫描从图像底部开始
  1727. for (i=0;i<Height;i++)
  1728. {
  1729. for(j=0;j<(int)Width/3;j++)
  1730. {
  1731. image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
  1732. image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
  1733. image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
  1734. if(image[j][1]<60)
  1735. {
  1736. image[j][1]=0;
  1737. image[j][2]=0;
  1738. image[j][3]=0;
  1739. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1740. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1741. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1742. }
  1743. j=0;
  1744. count=0;
  1745. while (j<(int)Width/3)
  1746. {
  1747. //因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
  1748. diff=abs(image[j][1]-image[j+1][1])*1.7;
  1749. b[j]=(((int)diff>150)?1:0);
  1750. count+=b[j];
  1751. j++;
  1752. }
  1753. //变化15次已是最高限了,再高就会使车牌出现空线
  1754. if (count<15) 
  1755. {
  1756.      for(j=0;j<(int)Width/3;j++)
  1757. {
  1758. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1759. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1760. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1761. }
  1762. }
  1763. else
  1764. {
  1765. //分区域扫描法
  1766. count=0;
  1767. //第一节
  1768. for(j=0;j<(int)Width/45;j++)
  1769. {
  1770. count+=b[j];
  1771. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1772. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1773. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1774. }
  1775. //剩余部分的简化算法
  1776. do
  1777. {
  1778. //变化6次是最佳经验值
  1779. if(count<5)
  1780. {
  1781. *(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/90)*3)=0;
  1782. *(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/90)*3+1)=0;
  1783. *(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/90)*3+2)=0;
  1784. }
  1785. count=count+b[j]-b[j-(int)Width/45];
  1786. j++;
  1787. }while(j<(int)Width/3);
  1788. for(j=j-(int)Width/45;j<(int)Width/3;j++)
  1789. {
  1790. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1791. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1792. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1793. //进一步扫描,消除图像中的残留点
  1794. for(j=0;j<(int)Width/3;j++)
  1795. {
  1796. image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
  1797. j=0;
  1798. count=0;
  1799. while (j<(int)Width/3)
  1800. {
  1801. //因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
  1802. diff=abs(image[j][1]-image[j+1][1])*1.7;
  1803. b[j]=(((int)diff>150)?1:0);
  1804. count+=b[j];
  1805. j++;
  1806. }
  1807. //变化3次已是最高限了,再高就会使车牌出现空线
  1808. if (count<6) 
  1809. {
  1810.      for(j=0;j<(int)Width/3;j++)
  1811. {
  1812. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1813. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1814. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1815. }
  1816.   for (i=Height-5;i<Height;i++)
  1817. {
  1818.     for (j=0;j<(int)Width/3 ;j++)
  1819. {
  1820. *(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
  1821. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
  1822. *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
  1823. }
  1824. pDoc->m_BM=true;
  1825. Invalidate();
  1826. }
  1827. void rgbToHSV(float r,float g,float b,float *h,float *s,float *v)
  1828. {
  1829. float max=MAX(r,MAX(g,b)),min=MIN(r,MIN(g,b));
  1830. float delta=max-min;
  1831. *v=max;
  1832. if(max!=0.0) *s=delta/max;
  1833. else *s=0.0;
  1834. if(*s==0.0) *h=NO_HUE
  1835. else
  1836. {
  1837. if(r==max) *h=(g-b)/delta;
  1838. else if(g==max) *h=2+(b-r)/delta;
  1839. else  *h=4+(r-g)/delta;
  1840. *h=*h*60;
  1841. if(*h<0) *h=*h+360;
  1842. }
  1843. }
  1844. void CBmpTestView::OnAreaMark() 
  1845. {
  1846. // TODO: Add your command handler code here
  1847. CBmpTestDoc* pDoc = GetDocument();
  1848. ASSERT_VALID(pDoc);  
  1849. HWND      hWnd;
  1850. int left[100],right[100],top[100],bottom[100],*pIntensity,*pSaturation,*pHue,SaturationI,HueI,IntensityI,i,j,k,premark,min,mark,Blue,Red,Green,markmax,Height,Width,Wid,Hei,*pHeight,*pWidth,*Widmax,*Heimax,CountofBlue,CountofGreen,CountofRed,maxofIntensity,maxofHue,maxofSat,max;
  1851. bool begin;
  1852. float Saturation,Hue,Intensity, ExpofIntensity,SigmaofIntensity,ExpofHue,SigmaofHue,ExpofSat,SigmaofSat;
  1853. float T0ofInt,T0,u1,u2,T1,w1,w2,u,sig1,sig2,u1ofInt,sig1ofInt,u2ofInt,sig2ofInt,distance,simulate;
  1854. CString s;
  1855. POINT  CurP,NeighborP,SeedP;
  1856. BYTE *lpTempPtr,*lpTempPtr1;
  1857. MYSTACK SeedFillStack;
  1858. if(pDoc->m_Dib.BPP<16)
  1859. return;
  1860. Height=(int) pDoc->m_Dib.Height;
  1861. Width=(int) pDoc->m_Dib.Bpl;
  1862. //建立堆栈,大小与图像相同
  1863. SeedFillStack.InitStack(hWnd,Height*Width);
  1864. mark=0;
  1865. //初始化与标号
  1866. for (i=0;i<Height;i++)
  1867. {
  1868. for(j=0;j<(int)Width/3;j++)
  1869. {
  1870. b[i][j]=0;
  1871. }
  1872. }
  1873. for (i=0;i<Height;i++)
  1874. {
  1875. for(j=0;j<(int)Width/3;j++)
  1876. {
  1877. //种子法和迷宫法并求出每个区域的最左,最右,最上,最下
  1878. if((unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3)!=0 && b[i][j]==0)
  1879. {
  1880. mark++;
  1881. left[mark]=(int)Width/3-1;right[mark]=0;bottom[mark]=Height-1;top[mark]=0;
  1882. SeedP.x=j;
  1883. SeedP.y=i;
  1884. SeedFillStack.MyPush(SeedP);
  1885. while(!SeedFillStack.IsStackEmpty())
  1886. {
  1887. CurP=SeedFillStack.MyPop();
  1888. b[CurP.y][CurP.x]=mark;
  1889. if(CurP.y>top[mark])
  1890. top[mark]=CurP.y;
  1891. if(CurP.y<bottom[mark])
  1892. bottom[mark]=CurP.y;
  1893. if(CurP.x>right[mark])
  1894. right[mark]=CurP.x;
  1895. if(CurP.x<left[mark])
  1896. left[mark]=CurP.x;
  1897. lpTempPtr=pDoc->m_Dib.m_Buffer+CurP.y*Width+CurP.x*3;
  1898. *lpTempPtr=255;
  1899. *(lpTempPtr+1)=255;
  1900. *(lpTempPtr+2)=255;
  1901. //标记颜色
  1902. /* switch(mark%4)
  1903. {
  1904. case 0:
  1905. *lpTempPtr=255;
  1906. *(lpTempPtr+1)=0;
  1907. *(lpTempPtr+2)=0;
  1908. break;
  1909. case 1:
  1910. *lpTempPtr=0;
  1911. *(lpTempPtr+1)=255;
  1912. *(lpTempPtr+2)=0;
  1913. break;
  1914. case 2:
  1915. *lpTempPtr=0;
  1916. *(lpTempPtr+1)=0;
  1917. *(lpTempPtr+2)=255;
  1918. break;
  1919. case 3:
  1920. *lpTempPtr=127;
  1921. *(lpTempPtr+1)=127;
  1922. *(lpTempPtr+2)=127;
  1923. break;
  1924. } */
  1925. //left neighbour
  1926. if(CurP.x>0 )
  1927. {
  1928. NeighborP.x=CurP.x-1;
  1929. NeighborP.y=CurP.y;
  1930. lpTempPtr1=lpTempPtr-3;
  1931. if(*lpTempPtr1!=0 && b[NeighborP.y][NeighborP.x]==0)
  1932. SeedFillStack.MyPush(NeighborP);
  1933. }
  1934. //down neighbour
  1935. if(CurP.y>0)
  1936. {
  1937. NeighborP.x=CurP.x;
  1938. NeighborP.y=CurP.y-1;
  1939. lpTempPtr1=lpTempPtr-Width;
  1940. if(*lpTempPtr1!=0 && b[NeighborP.y][NeighborP.x]==0)
  1941. SeedFillStack.MyPush(NeighborP);
  1942. }
  1943. //right neighbour
  1944. if(CurP.x<(int)Width/3-1)
  1945. {
  1946. NeighborP.x=CurP.x+1;
  1947. NeighborP.y=CurP.y;
  1948. lpTempPtr1=lpTempPtr+3;
  1949. if(*lpTempPtr1!=0 && b[NeighborP.y][NeighborP.x]==0)
  1950. SeedFillStack.MyPush(NeighborP);
  1951. }
  1952. //up neighbour
  1953. if(CurP.y<Height-1)
  1954. {
  1955. NeighborP.x=CurP.x;
  1956. NeighborP.y=CurP.y+1;
  1957. lpTempPtr1=lpTempPtr+Width;
  1958. if(*lpTempPtr1!=0 && b[NeighborP.y][NeighborP.x]==0)
  1959. SeedFillStack.MyPush(NeighborP);
  1960. }
  1961. }
  1962. }
  1963. }  //列结束
  1964. } //行结束
  1965. SeedFillStack.DeInitStack();
  1966. //计算每一区域的平均高度和宽度及区域面积
  1967. markmax=mark+1;
  1968. pWidth=new int[markmax];
  1969. pHeight=new int[markmax];
  1970. Heimax=new int[markmax];
  1971. Widmax=new int[markmax];
  1972. pIntensity=new int[256*markmax];
  1973. pSaturation=new int[256*markmax];
  1974. pHue=new int[256*markmax];
  1975. //先计算各个区域的平均宽度
  1976. for(i=0;i<markmax;i++)
  1977. {
  1978. pWidth[i]=0;
  1979. pHeight[i]=0;
  1980. Heimax[i]=0;
  1981. Widmax[i]=0;
  1982. for (j=0;j<256;j++)
  1983. {
  1984. pIntensity[j+i*256]=0;
  1985. pSaturation[j+i*256]=0;
  1986. pHue[j+i*256]=0;
  1987. }
  1988. }
  1989. for (i=0;i<Height;i++)
  1990. {
  1991. Wid=0;
  1992. premark=0;
  1993. for(j=0;j<(int)Width/3;j++)
  1994. {
  1995. mark=b[i][j];
  1996. if(mark!=0)
  1997. {
  1998. if(mark!=premark)
  1999. {
  2000. pWidth[mark]++;
  2001. Wid++;
  2002. premark=mark;
  2003. }
  2004. else
  2005. {
  2006. pWidth[mark]++;
  2007. Wid++;
  2008. }
  2009. }
  2010. else
  2011. {
  2012. if((Wid>Widmax[premark])&&(premark!=0))
  2013. Widmax[premark]=Wid;
  2014. Wid=0;
  2015. premark=0;
  2016. }
  2017. //计算各区域的平均高度
  2018. for(j=0;j<(int)Width/3;j++)
  2019. {
  2020. Hei=0;
  2021. premark=0;
  2022. for (i=0;i<Height;i++)
  2023. {
  2024. mark=b[i][j];
  2025. if(mark!=0)
  2026. {
  2027. if(mark!=premark)
  2028. {
  2029. pHeight[mark]++;
  2030. Hei++;
  2031. premark=mark;
  2032. }
  2033. else
  2034. {
  2035. pHeight[mark]++;
  2036. Hei++;
  2037. }
  2038. }
  2039. else
  2040. {
  2041. if((Hei>Heimax[premark])&&(premark!=0))
  2042. Heimax[premark]=Hei;
  2043. Hei=0;
  2044. premark=0;
  2045. }
  2046. //删除无用的区域
  2047. for(i=1;i<markmax;i++)
  2048. {
  2049. //求各区域平均宽度及平均高度
  2050. pWidth[i]/=Heimax[i];
  2051. pHeight[i]/=Widmax[i];
  2052. if(pWidth[i]>Width/9||pWidth[i]<Width/30)
  2053. Widmax[i]=0;
  2054. else
  2055. {
  2056. if(abs(pWidth[i]/pHeight[i]-2.5)>2)
  2057. Widmax[i]=0;
  2058. }
  2059. }
  2060. for (i=0;i<Height;i++)
  2061. {
  2062. for(j=0;j<(int)Width/3;j++)
  2063. {
  2064. mark=b[i][j];
  2065. if(mark!=0)
  2066. {
  2067. if(Widmax[mark]==0)
  2068. {
  2069. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+j*3;
  2070. *lpTempPtr=0;
  2071. *(lpTempPtr+1)=0;
  2072. *(lpTempPtr+2)=0;
  2073. b[i][j]=0;
  2074. }
  2075. else
  2076. {
  2077. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+j*3;
  2078. *lpTempPtr=255;
  2079. *(lpTempPtr+1)=255;
  2080. *(lpTempPtr+2)=255;
  2081. }
  2082. }
  2083. }
  2084. }
  2085.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  2086. {
  2087.     *(pDoc->m_Dib.m_Buffer+j)=(*(pDoc->m_Dib.m_Buffer+j))&(*(pDoc->m_Dib.m_Buffer1+j));
  2088. }
  2089. pDoc->m_BM=true;
  2090. Invalidate();
  2091. AfxMessageBox("下面是光强、色度、色饱和度直方图显示!");
  2092. m_Gradmax=0;
  2093.   for (i=0;i<Height;i++)
  2094. {
  2095. for(j=0;j<(int)Width/3;j++)
  2096. {
  2097. mark=b[i][j];
  2098. if(mark!=0)
  2099. {
  2100. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+j*3;
  2101.     Blue=(int) *lpTempPtr;
  2102. Green=(int) *(lpTempPtr+1);
  2103. Red=(int) *(lpTempPtr+2);
  2104. rgbToHSV(Red,Green,Blue,&Hue,&Saturation,&Intensity);
  2105. //如下是三个量的量化过程
  2106. HueI=(int) (Hue*255/360);
  2107. SaturationI=(int) (Saturation*255);
  2108. IntensityI= (int) Intensity;
  2109. // 直方图统计过程
  2110. pIntensity[IntensityI+mark*256]++;
  2111. pHue[HueI+mark*256]++;
  2112. pSaturation[SaturationI+mark*256]++; 
  2113. }
  2114. }
  2115. }
  2116. for(j=0;j<markmax;j++)
  2117. {
  2118. m_Gradmax=0;
  2119. CountofBlue=0;
  2120. CountofGreen=0;
  2121. CountofRed=0;
  2122.     for ( i=0;i<256;i++)
  2123. {
  2124. m_Grade_Blue[i]=pIntensity[i+j*256];
  2125. m_Grade_Green[i]=pHue[i+j*256];
  2126. m_Grade_Red[i]=pSaturation[i+j*256];
  2127. if (m_Grade_Blue[i]>m_Gradmax)
  2128. m_Gradmax=m_Grade_Blue[i];
  2129. if (m_Grade_Green[i]>m_Gradmax)
  2130. m_Gradmax=m_Grade_Green[i];
  2131. if (m_Grade_Red[i]>m_Gradmax)
  2132. m_Gradmax=m_Grade_Red[i];
  2133. CountofBlue=CountofBlue+m_Grade_Blue[i];
  2134. CountofGreen=CountofGreen+m_Grade_Green[i];
  2135. CountofRed=CountofRed+m_Grade_Red[i];
  2136. }
  2137. if (m_Gradmax>0)
  2138. {
  2139. pDoc->m_BM=false;
  2140. Invalidate();
  2141. ExpofIntensity=0;
  2142. ExpofHue=0;
  2143. SigmaofIntensity=0;
  2144. SigmaofHue=0;
  2145. ExpofSat=0;SigmaofSat=0;
  2146. // Calculate estimate and maxpoint of Intensity and Hue
  2147. max=0;min=0;
  2148.     for ( i=0;i<256;i++)
  2149. {
  2150. if(max<m_Grade_Blue[i])
  2151. {
  2152. max=m_Grade_Blue[i];
  2153. maxofIntensity=i;
  2154. }
  2155. if(min<m_Grade_Red[i])
  2156. {
  2157. min=m_Grade_Red[i];
  2158. maxofSat=i;
  2159. }
  2160. ExpofIntensity=ExpofIntensity+(float) i*m_Grade_Blue[i]/CountofBlue;
  2161. ExpofHue=ExpofHue+(float) i*m_Grade_Green[i]/CountofGreen;
  2162. ExpofSat=ExpofSat+(float) i*m_Grade_Red[i]/CountofRed;
  2163. }
  2164. max=0;
  2165. for ( i=0;i<256;i++)
  2166. {
  2167. if(max<m_Grade_Green[i])
  2168. {
  2169. max=m_Grade_Green[i];
  2170. maxofHue=i;
  2171. }
  2172. SigmaofIntensity=SigmaofIntensity+(float) (i-ExpofIntensity)*(i-ExpofIntensity)*m_Grade_Blue[i]/CountofBlue;
  2173. SigmaofHue=SigmaofHue+(float) (i-ExpofHue)*(i-ExpofHue)*m_Grade_Green[i]/CountofGreen;
  2174. SigmaofSat=SigmaofSat+(float) (i-ExpofSat)*(i-ExpofSat)*m_Grade_Red[i]/CountofRed;
  2175. }
  2176. SigmaofIntensity=sqrt(SigmaofIntensity);
  2177. SigmaofHue=sqrt(SigmaofHue);
  2178. SigmaofSat=sqrt(SigmaofSat);
  2179. //estimate if there is dual peak of Intensity
  2180. T0=ExpofIntensity;T1=0;
  2181. while (fabs(T0-T1)>0.01)
  2182. {
  2183. w1=0;w2=0;u1=0;u2=0;sig1=0;sig2=0;
  2184. for(i=0;i<=int(T0);i++)
  2185. {
  2186. w1=w1+(float)m_Grade_Blue[i]/CountofBlue;
  2187. u1=u1+(float)i*m_Grade_Blue[i]/CountofBlue;
  2188. }
  2189. u1=u1/w1;
  2190. for(i=0;i<=int(T0);i++)
  2191. {
  2192. sig1=sig1+(float)(i-u1)*(i-u1)*m_Grade_Blue[i]/CountofBlue;
  2193. }
  2194. for(i=int(T0)+1;i<256;i++)
  2195. {
  2196. w2=w2+(float)m_Grade_Blue[i]/CountofBlue;
  2197. u2=u2+(float)i*m_Grade_Blue[i]/CountofBlue;
  2198. }
  2199. u2=u2/w2;
  2200. for(i=int(T0)+1;i<256;i++)
  2201. {
  2202. sig2=sig2+(float)(i-u2)*(i-u2)*m_Grade_Blue[i]/CountofBlue;
  2203. }
  2204. T1=T0;T0=0.5*(u1+u2);sig1=sqrt(sig1);sig2=sqrt(sig2);
  2205. }
  2206. T0ofInt=T0;u1ofInt=u1;sig1ofInt=sig1;u2ofInt=u2;sig2ofInt=sig2;
  2207. //estimate if there is dual peak of Hue
  2208. T0=ExpofHue;T1=0;
  2209. while (fabs(T0-T1)>0.01)
  2210. {
  2211. w1=0;w2=0;u1=0;u2=0;sig1=0;sig2=0;
  2212. for(i=0;i<=int(T0);i++)
  2213. {
  2214. w1=w1+(float)m_Grade_Green[i]/CountofGreen;
  2215. u1=u1+(float)i*m_Grade_Green[i]/CountofGreen;
  2216. }
  2217. u1=u1/w1;
  2218. for(i=0;i<=int(T0);i++)
  2219. {
  2220. sig1=sig1+(float)(i-u1)*(i-u1)*m_Grade_Green[i]/CountofGreen;
  2221. }
  2222. for(i=int(T0)+1;i<256;i++)
  2223. {
  2224. w2=w2+(float)m_Grade_Green[i]/CountofGreen;
  2225. u2=u2+(float)i*m_Grade_Green[i]/CountofGreen;
  2226. }
  2227. u2=u2/w2;
  2228. for(i=int(T0)+1;i<256;i++)
  2229. {
  2230. sig2=sig2+(float)(i-u2)*(i-u2)*m_Grade_Green[i]/CountofGreen;
  2231. }
  2232. T1=T0;T0=0.5*(u1+u2);sig1=sqrt(sig1);sig2=sqrt(sig2);
  2233. }
  2234. s.Format("ExpofIntensity=%f,SigmaofIntensity=%f,T0ofIntensity=%f,u1ofInt=%f,sig1ofInt=%f,u2ofInt=%f,sig2ofInt=%f,!!!!!!,ExpofHue=%f,SigmaofHue=%f,T0=%f,u1=%f,sig1=%f,u2=%f,sig2=%f,%d,%d",ExpofIntensity,SigmaofIntensity,T0ofInt,u1ofInt,sig1ofInt,u2ofInt,sig2ofInt,ExpofHue,SigmaofHue,T0,u1,sig1,u2,sig2,maxofIntensity,maxofHue);
  2235. AfxMessageBox(s);
  2236. // judge if Intensity is dual peak or single peak
  2237. if (abs(ExpofIntensity-maxofIntensity)>15)
  2238. // dual peak
  2239.             {
  2240. if (abs(u1ofInt-maxofIntensity)<15)
  2241. {
  2242. ExpofIntensity=u1ofInt;
  2243. SigmaofIntensity=sig1ofInt;
  2244. }
  2245. else
  2246. {
  2247. if (abs(u2ofInt-maxofIntensity)<15)
  2248. {
  2249. ExpofIntensity=u2ofInt;
  2250. SigmaofIntensity=sig2ofInt;
  2251. }
  2252. // else
  2253. // ExpofIntensity=-1;
  2254. }
  2255. }
  2256. // judge if Hue is dual peak or single peak
  2257. if (abs(ExpofHue-maxofHue)>15)
  2258. // dual peak
  2259.             {
  2260. if (abs(u1-maxofHue)<15)
  2261. {
  2262. ExpofHue=u1;
  2263. SigmaofHue=sig1;
  2264. }
  2265. else
  2266. {
  2267. if (abs(u2-maxofHue)<15)
  2268. {
  2269. ExpofHue=u2;
  2270. SigmaofHue=sig2;
  2271. }
  2272. else
  2273. ExpofHue=-1;
  2274. }
  2275. }
  2276. s.Format("ExpofIntensity=%f,SigmaofIntensity=%f,ExpofHue=%f,SigmaofHue=%f,ExpofSat=%f,SigmaofSat=%f",ExpofIntensity,SigmaofIntensity,ExpofHue,SigmaofHue,ExpofSat,SigmaofSat);
  2277. AfxMessageBox(s);
  2278. // estimate the color of vehicle plate
  2279. //deal with blue
  2280. begin=false;
  2281. if(abs(ExpofHue-150)<19||(ExpofHue==-1&&abs(maxofHue-140)<9))
  2282. {
  2283. if((ExpofIntensity>60)&&(ExpofIntensity<242))
  2284. {
  2285. s.Format("车牌为兰色");
  2286. begin=true;
  2287. }
  2288. else
  2289. {
  2290. if(ExpofIntensity<=60)
  2291. {
  2292. s.Format("车牌为黑色");
  2293. begin=true;
  2294. }
  2295. else
  2296. {
  2297. s.Format("无用区域,删除");
  2298. for (i=0;i<Height;i++)
  2299. {
  2300. for(k=0;k<(int)Width/3;k++)
  2301. {
  2302. mark=b[i][k];
  2303. if(mark==j)
  2304. {
  2305. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+k*3;
  2306. *lpTempPtr=0;
  2307. *(lpTempPtr+1)=0;
  2308. *(lpTempPtr+2)=0;
  2309. b[i][k]=0;
  2310. }
  2311. }
  2312. }
  2313. }
  2314. }
  2315. }
  2316. else
  2317. { //deal with yellow
  2318. if(abs(ExpofHue-33)<5||(ExpofHue==-1&&abs(maxofHue-33)<5))
  2319. {
  2320. if ((ExpofIntensity>60)&&(ExpofIntensity<242))
  2321. {
  2322. s.Format("车牌为黄色");
  2323. begin=true;
  2324. }
  2325. }
  2326. else
  2327. {
  2328. if(ExpofIntensity<=60&&ExpofIntensity>=0)
  2329. {
  2330. s.Format("车牌为黑色");
  2331. begin=true;
  2332. }
  2333. else
  2334. {
  2335. if(ExpofIntensity>242||(ExpofIntensity==-1&&maxofIntensity>242))
  2336. {
  2337. s.Format("车牌为白色");
  2338. begin=true;
  2339. }
  2340. else
  2341. {
  2342. s.Format("无用区域,删除");
  2343. for (i=0;i<Height;i++)
  2344. {
  2345. for(k=0;k<(int)Width/3;k++)
  2346. {
  2347. mark=b[i][k];
  2348. if(mark==j)
  2349. {
  2350. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+k*3;
  2351. *lpTempPtr=0;
  2352. *(lpTempPtr+1)=0;
  2353. *(lpTempPtr+2)=0;
  2354. b[i][k]=0;
  2355. }
  2356. }
  2357. }
  2358. }
  2359. }
  2360. }
  2361. }
  2362. AfxMessageBox(s);
  2363. if(begin)
  2364. {
  2365.   for (i=bottom[j]-3;i<=top[j]+3;i++)
  2366. {
  2367. for(k=left[j];k<=right[j];k++)
  2368. {
  2369. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+k*3;
  2370. *lpTempPtr=255;
  2371. *(lpTempPtr+1)=255;
  2372. *(lpTempPtr+2)=255;
  2373. }
  2374. }
  2375. // s.Format("left=%d,right=%d,bottom=%d,top=%d",left[j],right[j],bottom[j],top[j]);
  2376. // AfxMessageBox(s);
  2377.   for (i=bottom[j]-3;i<=top[j]+3;i++)
  2378. {
  2379. for(k=left[j];k<=right[j];k++)
  2380. {
  2381. lpTempPtr=pDoc->m_Dib.m_Buffer1+i*Width+k*3;
  2382.     Blue=(int) *lpTempPtr;
  2383. Green=(int) *(lpTempPtr+1);
  2384. Red=(int) *(lpTempPtr+2);
  2385. rgbToHSV(Red,Green,Blue,&Hue,&Saturation,&Intensity);
  2386. //如下是三个量的量化过程
  2387. HueI=(int) (Hue*255/360);
  2388. SaturationI=(int) (Saturation*255);
  2389. IntensityI= (int) Intensity;
  2390. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+k*3;
  2391. distance=sqrt(pow(SaturationI*cos(HueI*2*pi/255)/255-ExpofSat*cos(ExpofHue*2*pi/255)/255,2)+pow(SaturationI*sin(HueI*2*pi/255)/255-ExpofSat*sin(ExpofHue*2*pi/255)/255,2)+pow((IntensityI-ExpofIntensity)/255,2));
  2392. simulate=1-distance/sqrt(5);
  2393. // s.Format("simulate=%f",simulate);
  2394. // AfxMessageBox(s);
  2395. if(simulate>0.85)
  2396. {
  2397. *lpTempPtr=255;
  2398. *(lpTempPtr+1)=255;
  2399. *(lpTempPtr+2)=255;
  2400. }
  2401. else
  2402. {
  2403. *lpTempPtr=0;
  2404. *(lpTempPtr+1)=0;
  2405. *(lpTempPtr+2)=0;
  2406. }
  2407. }
  2408. }
  2409. }
  2410. }
  2411. }
  2412.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
  2413. {
  2414.     *(pDoc->m_Dib.m_Buffer+j)=(*(pDoc->m_Dib.m_Buffer+j))&(*(pDoc->m_Dib.m_Buffer1+j));
  2415. }
  2416. delete []pWidth;
  2417. delete []pHeight;
  2418. delete []Widmax;
  2419. delete []Heimax;
  2420. delete []pIntensity;
  2421. delete []pSaturation;
  2422. delete []pHue;
  2423. pDoc->m_BM=true;
  2424. Invalidate();
  2425. }
  2426. void CBmpTestView::OnLocating() 
  2427. {
  2428. // TODO: Add your command handler code here
  2429. OnEdgeColorprewitt1();
  2430. OnDensityScanMid();
  2431. OnMidFiltLine();
  2432. OnClose();
  2433. OnAreaMark();
  2434. }
  2435. void CBmpTestView::OnVehicleBitmap() 
  2436. {
  2437. // TODO: Add your command handler code here
  2438. CBmpTestDoc* pDoc = GetDocument();
  2439. ASSERT_VALID(pDoc);  
  2440. int i,j,Height,Width,th;
  2441. long s;
  2442. if(!pDoc->m_Dib.m_BmpLoaded)
  2443. {
  2444. AfxMessageBox("还没有打开图像文件");
  2445. return;
  2446. }
  2447. if(pDoc->m_Dib.BPP==8)
  2448. return;
  2449. Height=(int) pDoc->m_Dib.Height;
  2450. Width=(int) pDoc->m_Dib.Bpl;
  2451. s=0;
  2452.     for ( i=0;i<256;i++)
  2453. {
  2454. m_Grade_Blue[i]=0;
  2455. }
  2456.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j=j+3)
  2457. {
  2458.     m_Grade_Blue[int(*(pDoc->m_Dib.m_Buffer+j))]++;
  2459. }
  2460. i=255;
  2461. do {
  2462. s+=m_Grade_Blue[i];
  2463. i--;
  2464. }while(s<(int) pDoc->m_Dib.BufferSize/120);
  2465. th=i;
  2466.     for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j=j+3)
  2467. {
  2468.     if(*(pDoc->m_Dib.m_Buffer+j)>th)
  2469. {
  2470. // *(pDoc->m_Dib.m_Buffer+j)=255;
  2471. // *(pDoc->m_Dib.m_Buffer+j+1)=255;
  2472. // *(pDoc->m_Dib.m_Buffer+j+2)=255;
  2473. }
  2474. else
  2475. {
  2476. *(pDoc->m_Dib.m_Buffer+j)=0;
  2477. *(pDoc->m_Dib.m_Buffer+j+1)=0;
  2478. *(pDoc->m_Dib.m_Buffer+j+2)=0;
  2479. }
  2480. }
  2481. pDoc->m_BM=true;
  2482. Invalidate();
  2483. }
  2484. void CBmpTestView::OnBlueCut() 
  2485. {
  2486. // TODO: Add your command handler code here
  2487. CBmpTestDoc* pDoc = GetDocument();
  2488. ASSERT_VALID(pDoc);  
  2489. int i,j,k,Blue,Red,Green,Height,Width;
  2490. float Saturation,Hue,Intensity;
  2491. CString s;
  2492. BYTE *lpTempPtr,*lpTempPtr1;
  2493. if(pDoc->m_Dib.BPP<16)
  2494. return;
  2495. Height=(int) pDoc->m_Dib.Height;
  2496. Width=(int) pDoc->m_Dib.Bpl;
  2497.   for (i=0;i<Height;i++)
  2498. {
  2499. for(j=0;j<(int)Width/3;j++)
  2500. {
  2501. lpTempPtr=pDoc->m_Dib.m_Buffer+i*Width+j*3;
  2502.     Blue=(int) *lpTempPtr;
  2503. Green=(int) *(lpTempPtr+1);
  2504. Red=(int) *(lpTempPtr+2);
  2505. rgbToHSV(Red,Green,Blue,&Hue,&Saturation,&Intensity);
  2506. if((Hue>240)||(Hue<200))
  2507. {
  2508. *lpTempPtr=0;
  2509. *(lpTempPtr+1)=0;
  2510. *(lpTempPtr+2)=0;
  2511. }
  2512. }
  2513. }
  2514. pDoc->m_BM=true;
  2515. Invalidate();
  2516. }