基於邊緣改進的全域性閾值 opencv

2021-10-25 01:41:12 字數 1686 閱讀 9661

99.97%時候的二值圖(為了視覺化,灰度值範圍設定為0-255)

90%的二值圖

核心演算法:

void edge_threshold(mat &src)

; uchar * d_data = dst.data;

for (int j = 0; j < dst.rows; j++)

}} long sum = 0, amount = 0;

double percent;

int t = 0;

for (int k = 0; k < 256; k++)

for (int i = 0; i < 256; i++) }

threshold(dst, thre, t, 1, thresh_binary);

mat src2;

src2 = thre.mul(src1);//取thre 中的畫素值為1的畫素點。

mat src3;

threshold(src1, src3, otsuthreshold(src2), 255, thresh_binary);

imshow("result", src3);

}

otsu演算法:

int otsuthreshold(mat src)

; uchar * s_data = src.data;

for (int i = 0; i < height; i++) }

int m = 0, n = 0; //m:第乙個有畫素的灰度值 n:最後乙個有畫素的灰度值

long sum_value = 0;//非零畫素個數

bool singel = true;

for (int i = 1; i < 256; i++)

if (histogram[i] != 0)

}for (int j = 255; j >= 0; j--) }

float sum0, sum1, cnt0, cnt1, w0, w1, u0, u1, u, variance;

float maxvariance = 0;

for (int i = m+1; i <= n; i++)

u0 = (double)sum0 / cnt0;

w0 = (double)cnt0 / sum_value;

for (int j = i; j <= n; j++)

u1 = (double)sum1 / cnt1;

w1 = (double)cnt1 / sum_value;

u = u0 * w0 + u1 * w1; //影象的平均灰度

variance = w0 * w1 * (u0 - u1) * (u0 - u1);

if (variance > maxvariance)

}} return threshold;

}

閾值的切割 基於opencv

一 基於固定閾值的分割 全域性 1 基本定義 固定閾值的分割是 最為簡單的一種影象分割方法,即選取乙個全域性閾值,然後就把整幅影象分成了非黑即白的二值影象。2 關鍵函式 ret,th cv2.threshold img,127,255,cv2.thresh binary ret return val...

基於法線的邊緣檢測

在邊緣高亮效果 中我提到過兩種方法,各有優缺點吧 影象空間域的邊緣檢測效果比較好,中間沒有多餘的線條.缺點是ps中計算比較慢 第二種把模型 放大 其實是變胖 的做法,可以在vs中完成,不需要額外的rendertarget,適合低端顯示卡使用,適應性好.不如果模型法線資訊不對的話,會造成畫面錯亂.實際...

基於Co training的改進演算法

co expectation maximizationalgorithm nigam 和ghani 2002 提出通過 隨機分割的特性,手動地對多個檢視進行聯合訓練,即使沒有自然的多個檢視,也可以提高效能。他們還提出了一 種co em 演算法,它擴充套件 了co training 演算法的原始引導方...