欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

背景填充

程序员文章站 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;
}

 

相关标签: 背景填充