图像横纵填充算法

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 定期更新源代码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值