NiBlack二值化演算法和區域性均值法
Niblack二值化演算法是比較簡單的區域性閾值方法,閾值的計算公式是T = m + k*v,其中m為以該畫素點為中心的區域的平均灰度值,v是該區域的標準差,k是一個修正係數
這幾天在研究靜脈的影像二值化,然後百度了幾次無果,要不然就是效果差,達不到心中的期待值。所以打算自己動手造一下輪子。
首先我用了區域性均值法,效果挺棒的。廢話不多說,看程式碼;
void Mean_method(BYTE *image_in, BYTE *image_out, int xsize, int ysize)
{
/*////////////////////////////////////////////////////////////////////
// 作者:楊魁
//引數列表:
//image_in 輸入影像的指標
//image_out 輸出影像的指標
//xsize 影像的寬
//ysize 影像的高
////////////////////////////////////////////////////////////////////*/
int sum = 0;
int i, j, h, k;;//用於迴圈
int T = 0;//閾值
int num = 0;//用於自加
int w_size = 7;//視窗大小為2*w_size+1
int Area = (2 * w_size + 1)*(2 * w_size + 1);
int *d = (int *)malloc(sizeof(int)*Area);//陣列空間
for (j = w_size; j < ysize - w_size; j++)
{
for (i = w_size; i < xsize - w_size; i++)
{
sum = 0;
num = 0;
for (h = 0; h < 2 * w_size + 1; h++)
{
for (k = 0; k < 2 * w_size + 1; k++)
{
d[num++] = GetGray(image_in, xsize, i + w_size - k, j + w_size - h);
}
}
for (h = 0; h < Area; h++)
{
sum += d[h];
}
T = sum / Area;
*(image_out + j *xsize + i) = *(image_in + j *xsize + i) > T ? 255 : 0;
}
}
free(d);
}
我寫的比較簡單。例如邊緣我直接沒有處理。待我慢慢改進。處理的影像效果如下。 效果不錯吧。
然後我又換了一種被叫做Niblack的演算法。程式碼如下:
void NiBlack(BYTE *image_in, BYTE *image_out, int xsize, int ysize)
{
/*////////////////////////////////////////////////////////////////////
// 作者:楊魁
//引數列表:
//image_in 輸入影像的指標
//image_out 輸出影像的指標
//xsize 影像的寬
//ysize 影像的高
////////////////////////////////////////////////////////////////////*/
int sum = 0;
int i, j, h, k;;//用於迴圈
int Average = 0;//平均值
int num = 0;//用於自加
int w_size = 7;//視窗大小為2*w_size+1
int Area = (2 * w_size + 1)*(2 * w_size + 1);
int *d = (int *)malloc(sizeof(int)*Area);//陣列空間
int T = 0;//閾值
int S = 0;//標準差
for (j = w_size; j < ysize - w_size; j++)
{
for (i = w_size; i < xsize - w_size; i++)
{
sum = 0;
num = 0;
for (h = 0; h < 2 * w_size + 1; h++)
{
for (k = 0; k < 2 * w_size + 1; k++)
{
d[num++] = GetGray(image_in, xsize, i + w_size - k, j + w_size - h); //求area領域內的畫素值
}
}
for (h = 0; h <Area; h++)
{
sum += d[h];//求總和
}
Average = sum / Area;
sum = 0;
for (h = 0; h < Area; h++)
{
sum += (d[h] * d[h]);
}
S = sqrt((float)sum);
S = S / Area;
T = Average + 0.05*S;//確定閾值
*(image_out + j *xsize + i) = *(image_in + j *xsize + i) > T ? 255 : 0;
}
}
free(d);
}
效果如下:
感覺並沒有變化,可能是我修正係數設定的不好。好了,就寫這麼多。我封裝了一個MyDib類,和一些常用的影像處理的演算法。如果感興趣可以一起來完善。
** 簡單的bmp圖片操作類和常用的影像處理函式**
相關文章
- ‘模組化‘ ’資訊隱藏和區域性化’
- SICP:賦值和區域性狀態(Python實現)賦值Python
- 程式效能優化-區域性性原理優化
- C#7.0--引用返回值和引用區域性變數C#變數
- golang實現二倍均值演算法和搶紅包Golang演算法
- 區域性變數和全域性變數變數
- 區域性性原理——各類優化的基石優化
- vue.js全域性元件和區域性元件區別Vue.js元件
- python學習筆記 區域性和全域性作用域Python筆記
- java 全域性變數和區域性變數Java變數
- Python的全域性和區域性變數Python變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- 全域性分割槽索引和區域性分割槽索引索引
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- webpack全域性和區域性安裝、解除安裝和執行Web
- 成員變數和區域性變數變數
- iOS架構:AOP實現區域性模組化iOS架構
- 【區域性特徵】ASIFT特徵
- 影像區域性特徵點檢測演算法綜述特徵演算法
- uni-app全域性樣式和區域性樣式APP
- 區域性方法$(“html”).load()和全域性方法$.get()、$.post()HTML
- python全域性變數和區域性變數, globalPython變數
- 成員變數和區域性變數的區別變數
- 酒店房間和 C++ 區域性變數的作用域C++變數
- K均值演算法演算法
- Python中的全域性變數和區域性變數Python變數
- js-js的全域性變數和區域性變數JS變數
- 記錄一下二倍均值紅包演算法演算法
- 為什麼要將區域性變數的作用域最小化?變數
- [Leetcode]303.區域和檢索&&304.二維區域和檢索LeetCode
- Java™ 教程(區域性類)Java
- 區域性內部類
- rtabmap 區域性建圖
- VUE-區域性使用Vue
- MapReduce程式設計基礎(二)——數值概要(計算最大值、最小值、平均值)程式設計
- Android影像灰度化、線性灰度變化、二值化處理方法Android