改進後的線條細化演算法

2022-08-26 07:15:10 字數 4051 閱讀 1276

原來每次遍歷都是一整張圖,現在每次都記錄下需要操作的起始位置,下一次直接遍歷起始位置就可以了。

原來的演算法執行100次的時間為3.901秒

改進後的時間為0.148秒

**如下:

1

//四周細化演算法

2void refinenew(mat& image, int

num)318

//用於存放每一列需要處理影象的高度

19for (int i = 0; i < width; i++)

2023

24 mat *im = reinterpret_cast((void*)&image); //

獲取畫素點資訊

25for (int ite = 0; ite < num; ite++)

2642

else

4346 p[0] = (get_gray(im, i + 1, j) == 0) ? 0 : 1

;47 p[1] = (get_gray(im, i + 1, j - 1) == 0) ? 0 : 1

;48 p[2] = (get_gray(im, i, j - 1) == 0) ? 0 : 1

;49 p[3] = (get_gray(im, i - 1, j - 1) == 0) ? 0 : 1

;50 p[4] = (get_gray(im, i - 1, j) == 0) ? 0 : 1

;51 p[5] = (get_gray(im, i - 1, j + 1) == 0) ? 0 : 1

;52 p[6] = (get_gray(im, i, j + 1) == 0) ? 0 : 1

;53 p[7] = (get_gray(im, i + 1, j + 1) == 0) ? 0 : 1;54

if (j < height - 2

)55 down = (get_gray(im, i, j + 2) == 0) ? 0 : 1; //

判斷下面第二格的狀態

56else

57 down = 1;58

//橫向直線

59if (p[6] && (p[5] || p[7] || p[0] || p[4]) && !(p[1] || p[3]) && p[2] == 0 &&down)

6063

if (p[2] && (p[1] || p[3] || p[0] || p[4]) && !(p[5] || p[7]) && p[6] == 0)64

67}68}

69if (!state)

7074

else

7579}80

81for (int i = 1; i < height - 2; i++)

8291

if (get_gray(im, 0, i - 1) == 0 && get_gray(im, 1, i + 1) && get_gray(im, 1, i) == 0 && get_gray(im, 0, i + 2))//

上1=0,下1,右下1,右1=0,下2

9295}96

//最下邊一行

97if (grayvalue != 0)98

103if (get_gray(im, width - 1, i - 1) == 0 && get_gray(im, width - 2, i + 1) && get_gray(im, width - 2, i) == 0 && get_gray(im, width - 1, i + 2))//

上1=0,下1,左下1,左1=0,下2

104107

}108

}109

for (int i = 0; i < del.size(); i++)

110114

115116

//左右收縮

117for (int i = 1; i < height - 1; i++)

118131

else

132135 p[0] = (get_gray(im, j + 1, i) == 0) ? 0 : 1

;136 p[1] = (get_gray(im, j + 1, i - 1) == 0) ? 0 : 1

;137 p[2] = (get_gray(im, j, i - 1) == 0) ? 0 : 1

;138 p[3] = (get_gray(im, j - 1, i - 1) == 0) ? 0 : 1

;139 p[4] = (get_gray(im, j - 1, i) == 0) ? 0 : 1

;140 p[5] = (get_gray(im, j - 1, i + 1) == 0) ? 0 : 1

;141 p[6] = (get_gray(im, j, i + 1) == 0) ? 0 : 1

;142 p[7] = (get_gray(im, j + 1, i + 1) == 0) ? 0 : 1

;143

if (j < width - 2

)144 right = (get_gray(im, j + 2, i) == 0) ? 0 : 1; //

判斷右邊第二格的狀態

145else

146 right = 1

;147

//豎直線

148if (p[0] && (p[1] || p[7] || p[2] || p[6]) && !(p[3] || p[5]) && p[4] == 0 &&right)

149152

if (p[4] && (p[3] || p[5] || p[2] || p[6]) && !(p[1] || p[7]) && p[0] == 0

)153

156157

}158

}159

if (!state)

160164

else

165169

170}

171172

//最左邊一列

173for (int j = 1; j < width - 2; j++)

174182

if (get_gray(im, j - 1, 0) && get_gray(im, j + 1, 0) == 0 && get_gray(im, j, 1) == 0 && get_gray(im, j - 1, 1))//

左1,右1=0,下1=0,左下1

183186

}187

}188

//最右邊一列

189for (int j = 1; j < width - 2; j++)

190198

if (get_gray(im, j - 1, height - 1) && get_gray(im, j + 1, height - 1) == 0 && get_gray(im, j, height - 2) == 0 && get_gray(im, j - 1, height - 2))//

左1,右1=0,下1=0,左下1

199202

}203

}204

for (int i = 0; i < del.size(); i++)

205209

210}

211212

213 }

c opencv中線條細化演算法

要達到的效果就是將線條盡量細化成單畫素,按照 上的hilditch演算法試了一下,發現效果不好,於是自己嘗試著寫了一下細化的演算法,基本原理就是從上下左右四個方向向內收縮。1.先是根據中的原則確定了以下16種情況 2.除錯過後發現,迭代次數多了之後,原來連線著的線條會斷開,分析原因如下圖 3.修改了...

改進後的篩選函式

private void queryindent click object sender,eventargs e if gs if nullflag gs and company gs else if khbh if nullflag khbh and khbh like khbh else if ...

Floyd演算法(改進後求最小環權值)

int gra maxs maxs dis maxs maxs 返回值為最小環權值.int floyd int n return mincircle 求當前最小環權值在更新dis之前是因為。當前的k不應該被連入dis i j 中。也就是說當前迭代求mincircle是對之前已求dis i j 包含k...