?? bmpdisplayview.cpp
字號:
// BmpDisplayView.cpp : implementation of the CBmpDisplayView class
//
#include "stdafx.h"
#include "BmpDisplay.h"
#include "BmpDisplayDoc.h"
#include "BmpDisplayView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBmpDisplayView
IMPLEMENT_DYNCREATE(CBmpDisplayView, CView)
BEGIN_MESSAGE_MAP(CBmpDisplayView, CView)
//{{AFX_MSG_MAP(CBmpDisplayView)
ON_WM_PAINT()
ON_COMMAND(ID_RGBTOGRAY, OnRgbtogray)
ON_COMMAND(ID_junhenghua, Onjunhenghua)
ON_COMMAND(ID_BianYuanJianChe, OnBianYuanJianChe)
ON_COMMAND(ID_QYQD, OnQyqd)
ON_COMMAND(ID_EZBZ, OnEzbz)
ON_COMMAND(ID_HXQY, OnHxqy)
ON_COMMAND(ID_JQDW, OnJqdw)
ON_COMMAND(IDR_JLFG, OnJlfg)
ON_COMMAND(IDR_CLDW, OnCldw)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBmpDisplayView construction/destruction
CBmpDisplayView::CBmpDisplayView()
{
useflag=true;
jflag=false;
}
CBmpDisplayView::~CBmpDisplayView()
{
}
BOOL CBmpDisplayView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CBmpDisplayView drawing
void CBmpDisplayView::OnDraw(CDC* pDC)
{
CBmpDisplayDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CBmpDisplayView printing
BOOL CBmpDisplayView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CBmpDisplayView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CBmpDisplayView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CBmpDisplayView diagnostics
#ifdef _DEBUG
void CBmpDisplayView::AssertValid() const
{
CView::AssertValid();
}
void CBmpDisplayView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CBmpDisplayDoc* CBmpDisplayView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBmpDisplayDoc)));
return (CBmpDisplayDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBmpDisplayView message handlers
void CBmpDisplayView::OnPaint() //顯示處理效果
{
RECT rect;
CString filename;
CPaintDC dc(this);
CBmpDisplayDoc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
GetClientRect(&rect);
int ox=(int)rect.left;
int oy=(int)rect.bottom;
if((pDoc->flag==1)&&(pDoc->yflag==0))
{
SetDIBitsToDevice(dc.m_hDC ,50,50,pDoc->bi.biWidth,pDoc->bi.biHeight,
0,0,0,pDoc->bi.biHeight,pDoc->lpBuf ,pDoc->pbi ,DIB_RGB_COLORS);
}
if(pDoc->yflag==1)
{
SetDIBitsToDevice(dc.m_hDC ,50,50 ,pDoc->bi.biWidth,pDoc->bi.biHeight,
0,0,0,pDoc->bi.biHeight,pDoc->ylpBuf ,pDoc->pbi ,DIB_RGB_COLORS);
}
if(pDoc->zflag==1)
{
StretchDIBits(dc.m_hDC,150,pDoc->bi.biHeight+120,pDoc->newLbl ,pDoc->newLbh,
pDoc->newLbpx,pDoc->newLbpy ,pDoc->newLbl,pDoc->newLbh,
pDoc->zlpBuf ,pDoc->pbi,DIB_RGB_COLORS,SRCCOPY);
if(diedai>0)
{
dc.TextOut(70,pDoc->bi.biHeight+120,"分類結果:");
if(pDoc->cflag==1)
{
dc.TextOut(300,pDoc->bi.biHeight+120,"迭代次數:");
CString s="";
s.Format("%d",diedai);
dc.TextOut(380,pDoc->bi.biHeight+120,s);
}
}
}
Invalidate(FALSE);
}
void CBmpDisplayView::OnRgbtogray() //彩色轉成灰度
{
BYTE *p_data;
int width,height,Dibwidth;
CBmpDisplayDoc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
p_data=pDoc->lpBuf ;
height=pDoc->bi.biHeight;
width=pDoc->bi.biWidth ;
Dibwidth=pDoc->Dibwidth;
LPBYTE temp=new BYTE[height*Dibwidth];
memcpy(temp,p_data,height*Dibwidth);
pDoc->ylpBuf=temp;
if(pDoc->grayflag==0)
{
for(int s=0;s<256;s++)
pDoc->huidu[s]=0;
for(int i=0;i<height;i++)
for(int j=0;j<Dibwidth;j+=3)
{
BYTE *pbyBlue=p_data++;
BYTE *pbyGreen=p_data++;
BYTE *pbyRed=p_data++;
BYTE r=*pbyRed;
BYTE g=*pbyGreen;
BYTE b=*pbyBlue;
unsigned char gray=(unsigned char)(0.31*r+0.59*g+0.11*b);
*pbyBlue=*pbyGreen=*pbyRed=gray;
pDoc->huidu[gray]++;
}
for( i=0;i<256;i++)
{
(pDoc->tongji [i])=(pDoc->huidu[i])/(height*width*1.0f);
}
pDoc->grayflag=1;
}
}
void CBmpDisplayView::Onjunhenghua() //圖像均衡化
{
BYTE *p_data;
int width,height,Dibwidth;
float temp[256];
int nr[256];
CBmpDisplayDoc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
p_data=pDoc->lpBuf ;
height=pDoc->bi.biHeight;
width=pDoc->bi.biWidth ;
Dibwidth=pDoc->Dibwidth;
int gmin=40;
int gmax=245;
for(int i=0;i<256;i++)
{
if(i==0)
{
temp[0]=pDoc->tongji[0];
}
else
{
temp[i]=temp[i-1]+pDoc->tongji[i];
}
nr[i]=(int)(255.0f*temp[i]+0.5f);
}
for(int s=0;s<256;s++)
pDoc->huidu[s]=0;
for(i=0;i<height;i++)
for(int j=0;j<Dibwidth;j+=3)
{
BYTE *pbyBlue=p_data++;
BYTE *pbyGreen=p_data++;
BYTE *pbyRed=p_data++;
int r=*pbyRed;
BYTE g=*pbyGreen;
BYTE b=*pbyBlue;
unsigned gray=r;
if((int)gray<gmin)
gray=0;
else
if((int)gray>gmax)
gray=255;
else
gray=abs(255*(gray-gmin)/(gmax-gmin));
*pbyBlue=*pbyGreen=*pbyRed=gray;
pDoc->huidu[gray]++;
}
pDoc->grayflag=1;
}
void CBmpDisplayView::OnBianYuanJianChe() //基于邊緣檢測
{
BYTE *p_data;
int width,height,Dibwidth;
int gray;
CBmpDisplayDoc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
p_data=pDoc->lpBuf ;
height=pDoc->bi.biHeight;
width=pDoc->bi.biWidth ;
Dibwidth=pDoc->Dibwidth;
LPBYTE temp=new BYTE[height*Dibwidth];
memcpy(temp,p_data,height*Dibwidth);
LPBYTE temp2=new BYTE[height*Dibwidth];
memcpy(temp2,p_data,height*Dibwidth);
vlpBuf=p_data;
memcpy(temp,p_data,height*Dibwidth);
int vsobel[3][3]={{1,0,-1},{2,0,-2},{1,0,-1}};
for(int i=1;i<height-1;i++)
for(int j=1;j<width-1;j++)
{ gray=0;
for(int s=-1;s<=1;s++)
for(int t=-1;t<=1;t++)
{
gray=gray+temp[(i+s)*Dibwidth+(j+t)*3]*vsobel[s+1][t+1];
}
gray=abs(gray);
if(gray>255)
gray=255;
else
gray=(int)(gray+0.5);
temp2[i*Dibwidth+j*3]=gray;
temp2[i*Dibwidth+j*3+1]=gray;
temp2[i*Dibwidth+j*3+2]=gray;
}
pDoc->rlpBuf=temp2;
delete temp;
pDoc->rflag=1;
}
void CBmpDisplayView::OnEzbz() //圖像二值化
{
BYTE *p_data;
int width,height,Dibwidth;
int gray;
CBmpDisplayDoc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
p_data=pDoc->rlpBuf;
height=pDoc->bi.biHeight;
width=pDoc->bi.biWidth ;
Dibwidth=pDoc->Dibwidth;
LPBYTE temp=new BYTE[height*Dibwidth];
for(int i=1;i<height-1;i++)
for(int j=1;j<width-1;j++)
{
gray=p_data[i*Dibwidth+j*3];
if(gray>60)
{ temp[i*Dibwidth+j*3+1]=temp[i*Dibwidth+j*3+2]=temp[i*Dibwidth+j*3]=255;
EZ[i][j]=1;
}
else
{
temp[i*Dibwidth+j*3+1]=temp[i*Dibwidth+j*3+2]=temp[i*Dibwidth+j*3]=0;
EZ[i][j]=0;
}
}
pDoc->rlpBuf=temp;
pDoc->rflag=1;
}
void CBmpDisplayView::OnHxqy() //檢測候選區域并二值化
{
int mj=0;
int yxmj=0;
BYTE *p_data;
int width,height,Dibwidth;
int gray;
int h[720];
int v[720];
CBmpDisplayDoc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
p_data=pDoc->rlpBuf ;
height=pDoc->bi.biHeight;
width=pDoc->bi.biWidth ;
Dibwidth=pDoc->Dibwidth;
LPBYTE temp=new BYTE[height*Dibwidth];
memcpy(temp,p_data,height*Dibwidth);
for(int i=0;i<720;i++)
h[i]=0;
for( i=0;i<height*5/6;i=i+3)
{
for(int j=1;j<(width-1);j++)
{
if((EZ[i][j]==1))
mj++;
if((EZ[i][j]==0)&&(mj<=9)&&(mj>=5))
{
mj=0;
yxmj++;
}
}
if((yxmj>6))
h[i]=yxmj;
mj=0;
yxmj=0;
}
for(i=1;i<height-1;i++)
if(h[i]==0)
for(int s=1;s<width-1;s++)
{
temp[i*Dibwidth+s*3+1]=temp[i*Dibwidth+s*3+2]=temp[i*Dibwidth+s*3]=0;
}
int hs=0;
i=0;
while((hs<=7)&&(i<=height-1))
{
if(h[i]!=0)
hs++;
i++;
}
if(i<=height-1)
for(int s=i;s<height-1;s++)
for(int j=1;j<width-1;j++)
{
temp[s*Dibwidth+j*3+1]=temp[s*Dibwidth+j*3+2]=temp[s*Dibwidth+j*3]=0;
for(int t=i-1;t<600;t++)
h[t]=0;
}
delete temp;
LPBYTE temp3=new BYTE[height*Dibwidth];
memset(temp3,255,height*Dibwidth);
int pixel[4];
BYTE *vlpdata;
vlpdata=vlpBuf;
for( i=0;i<height-1;i++)
for(int j=0;j<width-1;j++)
{
pixel[0]=vlpdata[i*Dibwidth+j*3];
pixel[1]=vlpdata[i*Dibwidth+(j+1)*3];
pixel[2]=vlpdata[(i+1)*Dibwidth+j*3];
pixel[3]=vlpdata[(i+1)*Dibwidth+(j+1)*3];
temp3[i*Dibwidth+j*3]=(int)sqrt((pixel[0]-pixel[3])
*(pixel[0]-pixel[3])+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
temp3[i*Dibwidth+j*3+1]=temp3[i*Dibwidth+j*3+2]=temp3[i*Dibwidth+j*3];
}
for( i=1;i<width-1;i++)
for(int j=1;j<height-1;j++)
{
gray=temp3[j*Dibwidth+i*3];
if(gray>60)
{ temp3[j*Dibwidth+i*3+1]=temp3[j*Dibwidth+i*3+2]=temp3[j*Dibwidth+i*3]=255;
vEZ[i][j]=1;
}
else
{
temp3[j*Dibwidth+i*3+1]=temp3[j*Dibwidth+i*3+2]=temp3[j*Dibwidth+i*3]=0;
vEZ[i][j]=0;
}
}
mj=0;
yxmj=0;
for( i=0;i<720;i++)
v[i]=0;
for( i=0;i<width-1;i++)
{
for(int j=1;j<height-1;j++)
{
if((vEZ[i][j]==1))
mj++;
if((vEZ[i][j]==0)&&(mj<=10)&&(mj>=1))
{
for(int s=j-mj;s<=j;s++)
temp3[s*Dibwidth+i*3+1]=temp3[s*Dibwidth+i*3+2]=temp3[s*Dibwidth+i*3]=0;
mj=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -