亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mydiblib.h

?? 《visual c++matlab圖像處理與識別實用案例精選》源碼
?? H
?? 第 1 頁 / 共 4 頁
字號:
                }
            }

            for(i=0; i<lx; i++)
            {
                for(j=0; j<ly; j++)
                {
                    kk = i*ly + j;
                    f[kk] = g[kk];
                }
            }
        }
    }while(shori);

    free(g);
}              


/*************************************************
*
* 函數名稱:
*       CharSegment()
*
*  參數:
*      HDIB  hDIB      -原圖像的句柄
*
*  返回值:
*     CRectLink        -存放被分割的各個字符位置信息的鏈表
*
* 功能:
*    將圖像中待識別的字符逐個分離出來并返回存放各個字符的位置信息的鏈表
*
*  說明:
*    此函數只能對2值化后的圖像進行處理
*
*********************************************************/


CRectLink CharSegment(HANDLE hDIB)
{
	
	//清空用來保存每個字符區域的鏈表
	CRectLink charRect1,charRect2;
	charRect1.clear();
	charRect2.clear();

	// 指向DIB的指針
	LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
	
	// 指向DIB象素指針
	LPSTR    lpDIBBits;	

	// 找到DIB圖像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	//指向象素的的指針
	BYTE* lpSrc;

	//圖像的長度和寬度
	int height,width;

	//獲取圖像的寬度
	width=(int)::DIBWidth(lpDIB);

	//獲取圖像的長度
	height=(int)::DIBHeight(lpDIB);

	//計算圖像每行的字節數
	LONG	lLineBytes = WIDTHBYTES(width * 8);

	//定義上下邊界兩個變量
	int top,bottom;

    //象素的灰度值
    int gray; 

	//設置循環變量
	int i,j;

	//用來統計圖像中字符個數的計數器
	digicount=0;


	//從上往下掃描,找到上邊界

	//行
	for (i=0;i<height;i++)
	{
         //列
  		for (j=0;j<width;j++)
		{
            // 指向圖像第i行,第j個象素的指針
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

			//獲得該點的灰度值
			gray = *(lpSrc);

			//看是否為黑點
			if (gray == 0)
			{   
               //若為黑點,把此點作為字符大致的最高點
				top = i;

				//對i強行賦值以中斷循環
				i=height;

				//跳出循環
				break;
			}

        //如果該點不是黑點,繼續循環
		}
	}


    //從下往上掃描,找下邊界

	//行
	for (i = height-1;i>=0;i--)
    {

		//列
		for (j=0;j<width;j++)
		{
			// 指向圖像第i行,第j個象素的指針
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

			//獲取該點的灰度值
			gray = *(lpSrc);

			//判斷是否為黑點
			if (gray == 0)
			{
				//若為黑點,把此點作為字符大致的最低點
				bottom = i;

				//對i強行賦值以中斷循環
				i=-1;

				//跳出循環
				break;
			}

          //如果該點不是黑點,繼續循環
		}
	
	}

	//lab 用作是否進入一個字符分割的標志
	bool lab = false;

	//表明掃描一列中是否發現黑色點
	bool black = false;

    //存放位置信息的結構體
	CRect rect;

	//計數器置零
	digicount=0;
   
	//行
	for (i=0;i<width;i++)
	{
		//開始掃描一列
		black=false;

		for (j=0;j<height;j++)
			{	
				// 指向圖像第i行,第j個象素的指針
				lpSrc = (unsigned char*)lpDIBBits + lLineBytes * j + i;

				//獲取該點的灰度值
				gray = *(lpSrc);

                //判斷是否為黑點
				if (gray == 0)
				{
					//如果發現黑點,設置標志位
					black=true;

					//如果還沒有進入一個字符的分割
					if(lab==false)
					{	
						//設置左側邊界
						rect.left = i;

						//字符分割開始
						lab = true;
					}

					//如果字符分割已經開始了
					else

                      //跳出循環
						break;
				}		
			}

		//如果已經掃到了最右邊那列,說明整副圖像掃描完畢。退出
           if(i==(width-1))
			   
		 //退出整個循環	   
		   break;

		//如果到此black仍為false,說明掃描了一列,都沒有發現黑點。表明當前字符分割結束
		if(lab==true&&black==false)
		{   
           //將位置信息存入結構體中

           //設置右邊界
			rect.right =i;

			//設置上邊界
			rect.top =top;

			//設置下邊界
			rect.bottom =bottom;

			//將框外括一個象素,以免壓到字符
			rect.InflateRect (1,1);

            //將這個結構體插入存放位置信息的鏈表1的后面
			charRect1.push_back (rect);

			//設置標志位,開始下一次的字符分割
			lab=false;

			//字符個數統計計數器加1
			digicount++;
			
		}

		//進入下一列的掃描

	}

   //再將矩形輪廓矩形的top和bottom精確化

	//將鏈表1賦值給鏈表2
	charRect2=charRect1;

    //將鏈表2的內容清空
    charRect2.clear ();

	//建立一個新的存放位置信息的結構體
	CRect rectnew;

	//對于鏈表1從頭至尾逐個進行掃描
	while(!charRect1.empty())
	{    
		//從鏈表1頭上得到一個矩形
		rect= charRect1.front();

		//從鏈表1頭上面刪掉一個
		charRect1.pop_front();

		//計算更加精確的矩形區域

		//獲得精確的左邊界
		rectnew.left =rect.left-1 ;

		//獲得精確的右邊界
		rectnew.right =rect.right+1 ;

		//通過獲得的精確左右邊界對上下邊境重新進行精確定位

		// 由下而上掃描計算上邊界
		
		//行
		for(i=rect.top ;i<rect.bottom ;i++)
		{   
          //列
			for(j=rect.left ;j<rect.right ;j++)
			{   
                 // 指向圖像第i行,第j個象素的指針
				lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

				//如果這個象素是黑點
				if (*lpSrc == 0)
				{	
					//設置上邊界
					rectnew.top = i-1;
					
					//對i進行強制定義以跳出循環
					i=rect.bottom  ;

					//跳出循環
					break;
				}	
			}
		}

		//由下而上掃描計算下邊界
   
        //行
		for(i=rect.bottom-1 ;i>=rect.top  ;i--)
		{
			//列
			for(j=rect.left ;j<rect.right ;j++)
			{
				// 指向圖像第i行,第j個象素的指針
				lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

				//該點如果為黑點
				if (*lpSrc == 0)
				{	
					//設置下邊界
					rectnew.bottom = i+1;

                    //對i進行強制定義以跳出循環
					i=-1;
                    //跳出循環
					break;
				}	
			}
		}

		//將得到的新的準確的位置信息從后面插到鏈表2的尾上
		charRect2.push_back (rectnew);
	}

	//將鏈表2 傳遞給鏈表1
	charRect1=charRect2;
	
	//解除鎖定
	::GlobalUnlock(hDIB);

	//將鏈表1返回
	return charRect1;
}

/****************************************************************
* 函數名稱:
*      Convert256toGray()
*
* 參數:
*     HDIB hDIB     -圖像的句柄
*
*  返回值:
*        無
*
*  功能:
*     將256色位圖轉化為灰度圖
*
***************************************************************/

void Convert256toGray(HDIB hDIB)
{
	LPSTR	lpDIB;
	
	// 由DIB句柄得到DIB指針并鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
	
	// 指向DIB象素數據區的指針
	LPSTR   lpDIBBits;	

	// 指向DIB象素的指針
	BYTE *	lpSrc;	

	// 圖像寬度
	LONG	lWidth;	
	// 圖像高度
LONG  	lHeight;	

	// 圖像每行的字節數
	LONG	lLineBytes;	

	// 指向BITMAPINFO結構的指針(Win3.0)
	LPBITMAPINFO lpbmi;	

	// 指向BITMAPCOREINFO結構的指針
	LPBITMAPCOREINFO lpbmc;
	
	// 獲取指向BITMAPINFO結構的指針(Win3.0)
	lpbmi = (LPBITMAPINFO)lpDIB;	

	// 獲取指向BITMAPCOREINFO結構的指針
	lpbmc = (LPBITMAPCOREINFO)lpDIB;	

	// 灰度映射表
	BYTE bMap[256];
	
	// 計算灰度映射表(保存各個顏色的灰度值),并更新DIB調色板
	int	i,j;
	for (i = 0; i < 256; i ++)
	{
		// 計算該顏色對應的灰度值
		bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +

					     0.587 * lpbmi->bmiColors[i].rgbGreen +

				         0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);			
		// 更新DIB調色板紅色分量
		lpbmi->bmiColors[i].rgbRed = i;	
		
		// 更新DIB調色板綠色分量
		lpbmi->bmiColors[i].rgbGreen = i;	
		
		// 更新DIB調色板藍色分量
		lpbmi->bmiColors[i].rgbBlue = i;
			
		// 更新DIB調色板保留位
		lpbmi->bmiColors[i].rgbReserved = 0;

	}
	// 找到DIB圖像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
		
	// 獲取圖像寬度
	lWidth = ::DIBWidth(lpDIB);	

	// 獲取圖像高度
	lHeight = ::DIBHeight(lpDIB);	

	// 計算圖像每行的字節數
	lLineBytes = WIDTHBYTES(lWidth * 8);	

// 更換每個象素的顏色索引(即按照灰度映射表換成灰度值)

//逐行掃描
for(i = 0; i < lHeight; i++)
{

  //逐列掃描
for(j = 0; j < lWidth; j++)
{
	// 指向DIB第i行,第j個象素的指針
	lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			
	// 變換
	*lpSrc = bMap[*lpSrc];
}
}

//解除鎖定
::GlobalUnlock ((HGLOBAL)hDIB);
}

/******************************************************************
*
* 函數名稱ConvertGrayToWhiteBlack()
*
* 參數 :HDIB hDIB     -原圖的句柄
*
* 返回值:無
*
* 功能: ConvertGrayToWhiteBlack函數采用硬閾值的方法,實現將圖像二值化的功能。
* 
* 說明:
要求待處理的圖片為256色
************************************************************************/

void ConvertGrayToWhiteBlack(HDIB hDIB)
{
	// 指向DIB的指針
	LPSTR	lpDIB;
	
	// 由DIB句柄得到DIB指針并鎖定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
	
	// 指向DIB象素數據區的指針
	LPSTR   lpDIBBits;
	
	// 指向DIB象素的指針
	BYTE *	lpSrc;	

	// 圖像寬度
	LONG	lWidth;	

	// 圖像高度
	LONG	lHeight;	
	// 圖像每行的字節數
	LONG	lLineBytes;	

	// 找到DIB圖像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);	
	
	// 獲取圖像寬度
	lWidth = ::DIBWidth(lpDIB);	

	// 獲取圖像高度
	lHeight = ::DIBHeight(lpDIB);	

	// 計算圖像每行的字節數
	lLineBytes = WIDTHBYTES(lWidth * 8);	

	// 更換每個象素的顏色索引(即按照灰度映射表換成灰度值)
	int i,j;

    //逐行掃描
	for(i = 0; i < lHeight; i++)
 {

   //逐列掃描
	for(j = 0; j < lWidth; j++)
	{

	// 指向DIB第i行,第j個象素的指針
	lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

	// 二值化處理

   //大于220,設置為255,即白點
	if(*lpSrc>220) *lpSrc=255;

  //否則設置為0,即黑點
	else *lpSrc=0;

	}

}
	
 //解除鎖定
::GlobalUnlock((HGLOBAL)hDIB);
}

/*****************************************************************
*
*  函數名稱 
*       DeleteScaterJudge()
*
*  參數:
*     LPSTR   lpDIBBits      -指向象素起始位置的指針
*	  WORD    lLineBytes     -圖像每行的字節數
*     LPBYTE  lplab          -標志位數組
*     int     lWidth         -圖像的寬度
*	  int     lHeight        -圖像的高度
*     int     x              -當前點的橫坐標
*	  int     y              -當前點的縱坐標 
*     CPoint  lab[]          -存放議考察過的連續點坐標
*     int     lianXuShu      -離散點的判定長度
*
*  返回值:
*     Bool                   -是離散點返回false 不是離散點返回true
*	 
*  功能:
*     利用遞歸算法統計連續點的個數,通過閾值來判定是否為離散點
*
*  說明:
*     只能對2值圖像進行處理
******************************************************************/     


bool DeleteScaterJudge(LPSTR lpDIBBits, WORD lLineBytes, LPBYTE lplab, int lWidth, int lHeight, int x, int y, CPoint lab[], int lianXuShu)
{
	
	//如果連續長度滿足要求,說明不是離散點,返回
	if(m_lianXuShu>=lianXuShu)
		return TRUE;

	//長度加一
	m_lianXuShu++;

	//設定訪問標志
	lplab[lWidth * y +x] = true;
	
	//保存訪問點坐標
	lab[m_lianXuShu-1].x = x;
	lab[m_lianXuShu-1].y = y;

	//象素的灰度值
	int gray;
  
	//指向象素的指針
	LPSTR lpSrc;

	//長度判定
    //如果連續長度滿足要求,說明不是離散點,返回
	if(m_lianXuShu>=lianXuShu)
		return TRUE;
	
	//下面進入遞歸
	else
	{	
		//考察上下左右以及左上、右上、左下、右下八個方向
		//如果是黑色點,則調用函數自身進行遞歸

		//考察下面點
		
		lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x;

		//傳遞灰度值
		gray=*lpSrc;

		//如果點在圖像內、顏色為黑色并且沒有被訪問過
		if(y-1 >=0 && gray == 0 && lplab[(y-1)*lWidth+x] == false)

		//進行遞歸處理		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美专区日韩专区| 国产精品久久久久久一区二区三区| 日韩欧美另类在线| 中文字幕永久在线不卡| 日本欧美大码aⅴ在线播放| 高清免费成人av| 日韩欧美中文字幕制服| 一区二区三区四区乱视频| 国产精品一品视频| 欧美一区日本一区韩国一区| 亚洲日本韩国一区| www.日韩大片| 国产欧美日韩在线| 韩国精品主播一区二区在线观看| 欧美嫩在线观看| 亚洲一区在线电影| 91在线观看视频| 中文字幕在线观看一区二区| 国产精品资源在线看| 精品国产伦一区二区三区免费 | 日韩电影在线免费看| 色悠悠久久综合| 亚洲欧洲av在线| 成人国产一区二区三区精品| 精品欧美一区二区久久| 毛片不卡一区二区| 91精品久久久久久久99蜜桃| 亚洲午夜久久久久久久久电影网| 99久久综合色| 最好看的中文字幕久久| 99久久夜色精品国产网站| 中文成人av在线| 成人午夜激情片| 国产精品久久久久婷婷| 99re66热这里只有精品3直播 | 福利电影一区二区| 国产欧美一区二区三区在线看蜜臀| 国产精品一区二区三区乱码| 国产午夜精品在线观看| 成人免费视频播放| 亚洲人成亚洲人成在线观看图片| 色综合天天综合在线视频| 中文字幕综合网| 精品视频一区二区三区免费| 亚洲成人tv网| 欧美成人女星排名| 高清国产一区二区| 亚洲精品videosex极品| 欧美性猛交xxxxxx富婆| 蜜桃免费网站一区二区三区| 国产调教视频一区| 91最新地址在线播放| 亚洲123区在线观看| 日韩欧美色电影| 不卡一区中文字幕| 亚洲成人动漫精品| 国产午夜精品久久久久久久| 97精品电影院| 日韩电影在线观看电影| 国产精品天天看| 欧美日韩一二三| 国产不卡视频在线观看| 亚洲伊人色欲综合网| 久久伊人蜜桃av一区二区| 99久久婷婷国产综合精品| 午夜亚洲国产au精品一区二区| 欧美videos中文字幕| 99re8在线精品视频免费播放| 天天亚洲美女在线视频| 亚洲国产精品成人综合| 欧美日韩免费高清一区色橹橹| 国产一区二区三区精品欧美日韩一区二区三区 | 日日摸夜夜添夜夜添精品视频 | 亚洲综合色在线| 精品成人a区在线观看| 色呦呦一区二区三区| 久久精品国产色蜜蜜麻豆| 国产精品超碰97尤物18| 日韩精品一区二区三区swag| 91免费在线视频观看| 久久国产精品色婷婷| 夜夜操天天操亚洲| 欧美国产日韩精品免费观看| 欧美一区二区在线视频| 在线中文字幕一区| 成人一道本在线| 极品少妇xxxx精品少妇| 亚洲 欧美综合在线网络| ...xxx性欧美| 国产亚洲视频系列| 精品粉嫩超白一线天av| 欧美日韩成人综合在线一区二区| 99免费精品在线观看| 国产老肥熟一区二区三区| 日韩av电影一区| 亚洲成人自拍网| 一区二区三区不卡在线观看| 国产精品久久久久影院亚瑟| 国产日产欧美一区二区视频| 精品国内二区三区| 日韩女优av电影在线观看| 欧美日韩精品三区| 在线精品视频免费观看| 色伊人久久综合中文字幕| 成人三级在线视频| 成人av网站免费观看| 国产99久久精品| 高清国产一区二区| 不卡在线观看av| 99国产精品国产精品久久| 99久久综合精品| 91丨九色丨黑人外教| 99re免费视频精品全部| 色噜噜狠狠成人中文综合 | 国产福利精品一区| 国产在线一区二区综合免费视频| 极品少妇一区二区| 国产乱人伦偷精品视频免下载| 国产精品一区二区三区99| 国产盗摄一区二区| 成人教育av在线| 99久久婷婷国产综合精品电影 | 久久一日本道色综合| 久久久国产精品午夜一区ai换脸| 久久久久久97三级| 中文字幕av免费专区久久| 综合欧美一区二区三区| 亚洲一区二三区| 日韩专区中文字幕一区二区| 久久精品久久99精品久久| 国产激情91久久精品导航| www.爱久久.com| 欧美一a一片一级一片| 欧美一区二区在线观看| 久久亚洲影视婷婷| 亚洲乱码国产乱码精品精可以看| 亚洲成a人v欧美综合天堂| 麻豆视频观看网址久久| 国产69精品久久久久777| 色av一区二区| 精品日韩一区二区| 中文字幕色av一区二区三区| 无码av免费一区二区三区试看| 久久99热99| 99精品久久久久久| 日韩一区二区三| 国产精品第一页第二页第三页| 亚洲福利视频一区| 国产毛片一区二区| 欧美色视频在线| 久久久91精品国产一区二区精品 | 曰韩精品一区二区| 美女网站色91| 色综合久久久久网| 精品国产乱码久久久久久夜甘婷婷 | 日韩一区二区三区四区| 国产欧美日本一区视频| 亚洲成人你懂的| 国产91精品在线观看| 欧美日韩一卡二卡三卡| 日本一区二区动态图| 日韩高清电影一区| 91在线观看一区二区| 日韩欧美成人激情| 亚洲精品高清在线| 粉嫩一区二区三区性色av| 欧美一区二区日韩| 一区二区三区美女视频| 国产成人自拍网| 精品久久免费看| 日韩黄色在线观看| 91久久精品午夜一区二区| 久久久久国产精品厨房| 蜜桃精品视频在线| 欧美日韩亚洲高清一区二区| 亚洲欧美另类图片小说| 成人一级片在线观看| 久久婷婷久久一区二区三区| 日本三级韩国三级欧美三级| 在线视频亚洲一区| 亚洲丝袜精品丝袜在线| 粉嫩av亚洲一区二区图片| 欧美变态凌虐bdsm| 蜜臀国产一区二区三区在线播放| 欧美丝袜自拍制服另类| 亚洲婷婷综合久久一本伊一区| 国产麻豆视频一区二区| 精品免费视频.| 麻豆精品一区二区三区| 欧美喷潮久久久xxxxx| 亚洲妇女屁股眼交7| 欧美伊人久久大香线蕉综合69| 亚洲欧美国产77777| 99久久婷婷国产综合精品电影| 欧美国产欧美综合| 丁香天五香天堂综合| 中文字幕 久热精品 视频在线| 国产麻豆一精品一av一免费| 国产午夜亚洲精品午夜鲁丝片| 国产乱妇无码大片在线观看|