背景填充
程序员文章站
2022-03-26 18:26:04
...
/*BackgroundFill参数说明:
BackgroundFill(
Uchar* ioput, 输入输出图像
int rowSize, 行数
int colSize, 列数
int i, 背景点纵坐标
int j, 背景点横坐标
Uchar backFlag, 图像背景点标记值
Uchar targetFlag 图像目标点标记值
)
*/
static int BackgroundFill(Uchar* ioput, int rowSize, int colSize, int i, int j, Uchar backFlag, Uchar targetFlag)
{
int maxSize = rowSize * colSize;
int* Q = (int*)malloc(2 * maxSize * sizeof(int));//maxSize * 2数组
memset(Q, 0, 2 * maxSize * sizeof(int));
int front = 0;//指明队头的位置
int rear = 0; //指明队尾的下一个位置;front = rear表示队空
int Neighbor4[2][4] =
{
{ -1, 0, 1, 0 },
{ 0, 1, 0, -1 }
};
if (ioput[i * colSize + j] == backFlag)//确认标记值是否为背景点
{
ioput[i * colSize + j] = targetFlag;
Q[rear * 2] = i;
Q[rear * 2 + 1] = j;
rear = rear + 1; //队尾后移
while (front != rear)
{
//队头出队
int temp_i = Q[front * 2];
int temp_j = Q[front * 2 + 1];
front = front + 1;
//把队头位置像素点8连通邻域中未作标记的白色像素点入队
for (int k = 0; k < 4; k++)
{
int y = temp_i + Neighbor4[0][k];
int x = temp_j + Neighbor4[1][k];
if ((y >= 0) & (y < rowSize) & (x >= 0) & (x < colSize))
{
if (ioput[y * colSize + x] == backFlag)
{
ioput[y * colSize + x] = targetFlag;
Q[rear * 2] = y;
Q[rear * 2 + 1] = x;
rear = rear + 1;
}
}
}
}
}
else
{
printf(" Error in BackgroundFill : Enter a non-Background point coordinate i,j \n");
free(Q);
Q = NULL;
return -1;
}
free(Q);
Q = NULL;
return 0;
}
上一篇: 94. 二叉树的中序遍历
下一篇: 背景透明