各位大神晚上好!
1、 我用bitmap.LockBits 提取byte[] (rgbValue)。
2、使用类似递归算法查找出相邻[3*3矩阵取值]颜色相近的值 存入一个容器中。代码如下
#region 变量
/// 数据是否标识
private HashSet markerPoint;
/// 整体数据缓存
private byte[] _rgbValue;
/// 比对精度阀值;0~255
/// 值越大精度越小
private byte _dSpool;
private int _offest;
private int _width, _height;
private List _dot;
#endregion
public List<TestDot> Run()
{
#region 去除外围一圈1Pixel的像素
//f(x)=Wy+x
for (int x0 = 0; x0 < _width; x0++)
{
int top = x0 * _offest;
int bottom = (_width * (_height - 1) + x0) * _offest;
markerPoint.Add(top);
markerPoint.Add(bottom);
}
for (int y0 = 0; y0 < _height; y0++)
{
int left = _width * y0 * _offest;
int right = left + (_width - 1) * _offest;
markerPoint.Add(left);
markerPoint.Add(right);
}
#endregion
List<TestDot> Edot = new List<TestDot>();
for (int index = _width * _offest; index < _rgbValue.Length; index = index + _offest)
{
// 步进 step-by-step
if (!markerPoint.Add(index)) continue;
FindNeighborDot(index);
if (_dot.Count == 0) continue;
Edot.Add(new TestDot() { EDot = new List<Dot>(_dot) });
_dot.Clear();
}
return Edot;
}//end
private void FindNeighborDot(int index)
{
Dot dot = new Dot()
{
R = _rgbValue[index],
G = _rgbValue[index + 1],
B = _rgbValue[index + 2],
Location =(uint)index
};
_dot.Add(dot);
Queue<int> queue = new Queue<int>();
int lOffset = _offest * _width;
queue.Enqueue(index);
while (queue.Count>0)
{
index = queue.Dequeue();
int[] pointList = ConvertHelper.FindNeighbor(index, _width, _offest);//相邻8个点 3x3矩阵
foreach (var item in pointList)
{
if (markerPoint.Add(item))
{
var i = NeighborComparison(item, index);
if (i != -1)
{
queue.Enqueue(i);
}
else markerPoint.Remove(i);
}
}
}
}
/// <summary>
/// 两点对比,相近则返回该点,不相近则返回-1
/// </summary>
/// <param name="neighborIndex">下一个点</param>
/// <param name="nowIndex">当前点</param>
/// <returns></returns>
private int NeighborComparison(int neighborIndex, int nowIndex)
{
if (Math.Abs(_rgbValue[neighborIndex] - _rgbValue[nowIndex]) <= _dSpool &&
Math.Abs(_rgbValue[neighborIndex + 1] - _rgbValue[nowIndex + 1]) <= _dSpool &&
Math.Abs(_rgbValue[neighborIndex + 2] - _rgbValue[nowIndex + 2]) <= _dSpool)
{
Dot dot = new Dot()
{
R = _rgbValue[neighborIndex],
G = _rgbValue[neighborIndex + 1],
B = _rgbValue[neighborIndex + 2],
Location = (uint)neighborIndex
};
_dot.Add(dot);
return neighborIndex;
}
else return -1;
}
3、我在把这些值按照 (Width*y+x)*offest 还原成byte[] 后生成图片如下
![原图](https://img-ask.csdn.net/upload/201610/10/1476109673_782690.jpg)
![还原图片](https://img-ask.csdn.net/upload/201610/10/1476109711_338263.png)
算法导致图片 中有一道黑线出现,一直查不出来 望高手指点!