专栏首页ROBOTEDU【简单的CV】2.1 设计一个“核”

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

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

正文

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

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

01

像素的索引

一维索引

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

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

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

二维索引

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

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

二维转一维

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

X1=8*1+7=15

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

        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为像素点离锚点的偏移量

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

        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。

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. 理解和设计“核”,并用它进行滤波

本文分享自微信公众号 - ROBOTEDU(RobotEDU_China),作者:EdenChen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【简单的CV】1.7 图像二值化

    二值化图像是一种特殊的灰度度,它的像素只有两个值0或者1,这样一个像素点用一位(Bit)就可以表示。

    EdenChen
  • 【CV学习2.2】 倒数与梯度

    EdenChen
  • 【赛题分析】分拣与排序(上)

    中职技能大赛 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    EdenChen
  • POJ 1741 Tree(树的点分治,入门题)

    Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21357 ...

    Angel_Kitty
  • C++ 虚函数表解析

    C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父...

    bear_fish
  • n-1位数

    已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。

    书童小二
  • 删除排序数组中的重复数字Ⅱ

    一份执着✘
  • 【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

      自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书...

    马三小伙儿
  • LeetCode 477 Total Hamming Distance

    The Hamming distance between two integers is the number of positions at which th...

    Yano_nankai
  • 【每日一练】第001期--两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    会呼吸的Coder

扫码关注云+社区

领取腾讯云代金券