NetJet被股神看好的“共享”飞机公司。
正文
本节简单地说明:如何将像素的二维数组索引转变为一维数组索引?
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. 理解和设计“核”,并用它进行滤波