前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【简单的CV】2.1 设计一个“核”

【简单的CV】2.1 设计一个“核”

作者头像
EdenChen
发布2019-11-25 23:05:31
7950
发布2019-11-25 23:05:31
举报
文章被收录于专栏:ROBOTEDU

NetJet被股神看好的“共享”飞机公司。

正文

本节简单地说明:如何将像素的二维数组索引转变为一维数组索引?

  1. 获取“核”周围像素的索引;
  2. 设计一个简单的二值化核

01

像素的索引

一维索引

图中第一行表示一个数字元素的一维数组,第二行则对应的是各个元素的位置索引。

例:黄色元素数字“3”,它的位置索引是4。

注:一维索引的开始位置从0开始。

二维索引

例:黄色数字37的索引为[4,3],5表示横向索引,3表示纵向索引。

注:一维索引的开始位置从0开始。

二维转一维

已知红色像素位置 [7,1],求它在一维数组中的位置索引X1。

X1=8*1+7=15

红色像素的在一维数组中的位置索引为15。

代码语言:javascript
复制
        public static int T2o(int l,int x,int y)        {            int num;            num = l * y + x;            return num;        }

为什么要将二维索引转一维索引

这是因为我们计算机在处理这些数组时,实际上都是一维的,使用二维索引 [X,Y]可能更加直观,但是使用一维数组索引更贴近计算机的存储方式,所以在提取元素的时候一维索引的处理速度会快于二维数组索引。

实际上,我们大部分计算都是通过灰度来计算,在以前内容中也介绍过如何将彩色图转为灰度图。(点击这里查看以前内容),我们的灰度图是用一维数组来表示的,所以转化更方便我们计算。

02

获取“核”周边的值

已知锚点 [5,4],求它3*3“核”的值。

实际上我们知道了锚点的位置索引,那么它周围的像素索引,都可以通过以它为中心的索引计算得到。

I [X,Y]=M [X+i,Y+i],i为像素点离锚点的偏移量

所以“核”中所有位置的索引为

代码语言:javascript
复制
        public static List<byte> Mcell(int l, int xl,int yl,int xp,int yp,byte[] gray)        {            List<byte> gray_vs = new List<byte>(xl * yl);            for (int y =yp -(yl-1)/2; y <yp+ (yl-1) /2+1; y++)            {                for (int x =xp- (xl-1) /2; x <xp+ (xl-1) /2+1; x++)                {                    gray_vs.Add(gray[T2o(l, x,y)]);                }            }            return gray_vs;        }

“核计算”预览视频(获取鼠标单击位置的“核”的各项像素值)

设计一个二值化的“核”,并用它进行滤波

高通滤波算法:

如果Avg的值小于预设的阈值,则把锚点的像素值设置为0,如果AVF的值大于等于预设阈值,则把锚点像素值改为255。

代码语言:javascript
复制
public static Bitmap MatAutoBool(Bitmap bitmap,int thr)        {            Bitmap dst_bitmap;            if (bitmap!=null)            {                dst_bitmap = new Bitmap(bitmap.Width, bitmap.Height);                for (int y = 1; y < dst_bitmap.Height- 1; y++)                {                    for (int x =1; x < dst_bitmap.Width-1; x++)                    {                        List<byte> cell = Mcell(bitmap.Width,3,3,x,y,grayValues);                        double cell_avg = cell.Average(funcbyte2int);                        if (cell_avg<thr)                        {                            dst_bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));                        }                        else                        {                            dst_bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));                        }                       }                }                return dst_bitmap;            }            else            {                return null;            }        }

小结

1. 理解和设计“核”,并用它进行滤波

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ROBOTEDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档