public static Image<Gray, Byte> 图像横纵向填充(Image<Gray, Byte> a)
{
Image<Gray, Byte> b = new Image<Gray, byte>(a.Width, a.Height, new Gray(0));
// b.SetTo(new MCvScalar(255));
MCvScalar s;
MCvScalar s_new;
s_new = new MCvScalar(255);//必须在这里实例化一下,不能直接向V0赋值,错误做法为s_new.V0=255
//记录填充行的最最左侧位置
int left_X = 0;
//记录填充行的最右侧位置
int right_X = 0;
int top_Y = 0;
int bottom_Y = 0;
//开始进行纵向填充
for (int wt = 0; wt < a.Width; wt++)
{
for (int ht = 0; ht < a.Height; ht++)
{
s = CvInvoke.cvGet2D(a, ht, wt);
if (s.V0 == 255)
{
top_Y = ht;//找到纵向上最上方的白点
for (int m = a.Height - 1; m >= 0; m--)
{
s = CvInvoke.cvGet2D(a, m, wt);
if (s.V0 == 255)
{
bottom_Y = m;
break;//跳出寻找最下边点的循环
}
}
//将top_Y与bottom_Y之间的点设置为白色
for (int i = top_Y; i <= bottom_Y; i++)
CvInvoke.cvSet2D(b, i, wt, s_new);
ht = a.Height;//强制跳出此列循环
}
}
}
//横向填充
for (int ht = 0; ht < a.Height; ht++)
{
for (int wt = 0; wt < a.Width; wt++)
{
s = CvInvoke.cvGet2D(a, ht, wt);
if (255 == s.V0)
{
left_X = wt;//找到最左边的白色点
for (int m = a.Width - 1; m >= 0; m--)
{
s = CvInvoke.cvGet2D(a, ht, m);
if (255 == s.V0)
{
right_X = m;
break;// 跳出寻找最右边点的循环
}
}
//将left_X与right_X之间的点设置为白色
for (int i = left_X; i <= right_X; i++)
CvInvoke.cvSet2D(b, ht, i, s_new);
wt = a.Width;//强制跳出此行循环
}
}
}
//返回mat a
return b;
}
(关注微信号:zgyngks 定期更新源代码)