matlab移植C/C++代碼時,發現不管是opencv還是IPP庫都沒有填充聯通區域函式imfill(),于是只能自己動手了,
先展示一下imfill()函式的功能,如下圖:

上圖中,左圖是一個二值影像,白色是手臂邊緣像素值為1,黑色區域像素值為0,現在想將手臂填充1,用imfill()函式可以實作該功能,但C/C++代碼需要自己實作,
C/C++代碼:
bool imFill(Ipp8u *img, int width, int height)
{
vector<int> q;
int head = 1;
int tail = 1;
int pix_x;
int pix1_x;
int pix, pix1;
int nerghbour1[8] = { -1, -1, -1, 0, 0, 1, 1, 1 }; //行坐標偏移
int nerghbour2[8] = { -1, 0, 1, -1, 1, -1, 0, 1 }; //列坐標偏移
q.push_back(round(height / 2)*width + round(width / 2) - 1);
tail = tail + 1;
do
{
pix = q[head - 1];
pix_x = pix % width;
for (int i = 0; i < 8; i++)
{
pix1 = pix + nerghbour2[i] + nerghbour1[i] * width;
pix1_x = pix1 % width;
if (pix1 < height*width && pix1 > 0 && abs(pix1_x - pix_x) < 2)
{
if (img[pix1] == 0)
{
img[pix1] = 1;
q.push_back(pix1);
tail = tail + 1;
}
}
}
//q.erase(q.begin());
head = head + 1;
} while (head != tail);
return true;
}
繼續搬磚了,原理改天附上,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/303136.html
標籤:其他
上一篇:PANet:基于金字塔注意力網路的影像超解析度重建(Pytorch實作)
下一篇:[論文筆記]DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
