原來每次遍歷都是一整張圖,現在每次都記錄下需要操作的起始位置,下一次直接遍歷起始位置就可以了。
原來的演算法執行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...