圖像編程學習筆記9――圖像的銳化
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
銳化(sharpening)和平滑恰恰相反,它是通過增強高頻分量來減少圖象中的模糊,因此又稱為高通濾波(high passfilter)。銳化處理在增強圖象邊緣的同時增加了圖象的噪聲。
常用的銳化模板是拉普拉斯(Laplacian)模板(見(3.4)式),又是個數學家的名字,可見學好數學,走遍天下都不怕。
(3.4)
容易看出拉普拉斯模板的作法:先將自身與周圍的8個象素相減,表示自身與周圍象素的差別;再將這個差別加上自身作為新象素的灰度。可見,如果一片暗區出現了一個亮點,那么銳化處理的結果是這個亮點變得更亮,增加了圖象的噪聲。
因為圖象中的邊緣就是那些灰度發生跳變的區域,所以銳化模板在邊緣檢測中很有用,這一點將在后面詳細介紹。
功能實現code:
[cpp] view plaincopy
- /**
- * 函數名: sharpening
- * 功 能: 對圖像進行銳化處理
- */
- void Laplacian()
- {
- int temp[9] = {-1,-1,-1,-1,9,-1,-1,-1,-1}; //Laplacian 模版
- int height = bmpInfoHeader.biHeight;
- int width = bmpInfoHeader.biWidth;
- int imgSize = bmpInfoHeader.biSizeImage;
- int lineByte = (width * 8 +31) / 32 * 4; //每行像素所占字節數
- //處理是基于原圖的,所以原圖的數據不能改變,用pNewBmpData存儲改變之后的數據
- memcpy(pNewBmpData,pBmpData,imgSize); //把原圖數據復制給pNewBmpData
- //注意邊界點不處理,所以i從1到高度-2,j類似
- double temResult; //中間結果
- for(int i = 1; i < height - 1; i++ )
- {
- for(int j = 1; j < width - 1; j++ )
- {
- temResult = (double)(*(pBmpData + (i-1) * lineByte + j - 1) * temp[0]);
- temResult += (double)(*(pBmpData + (i-1) * lineByte + j) * temp[1]);
- temResult += (double)(*(pBmpData + (i-1) * lineByte + j + 1) * temp[2]);
- temResult += (double)(*(pBmpData + (i) * lineByte + j - 1) * temp[3]);
- temResult += (double)(*(pBmpData + (i) * lineByte + j) * temp[4]);
- temResult += (double)(*(pBmpData + (i) * lineByte + j + 1) * temp[5]);
- temResult += (double)(*(pBmpData + (i+1) * lineByte + j - 1) * temp[6]);
- temResult += (double)(*(pBmpData + (i+1) * lineByte + j) * temp[7]);
- temResult += (double)(*(pBmpData + (i+1) * lineByte + j + 1) * temp[8]);
- *(pNewBmpData + i * lineByte + j) = temResult;
- }
- }
- }