背景填充

/*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;
}

猜你喜欢

转载自blog.csdn.net/u013297911/article/details/88057893