第二灵 2016-10-10 14:20 采纳率: 0%
浏览 1453

C#像素提取 提取相邻颜色相近像素,验证还原有问题。

各位大神晚上好!
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)
 算法导致图片 中有一道黑线出现,一直查不出来 望高手指点!
  • 写回答

1条回答 默认 最新

  • Longee 2016-10-17 02:38
    关注

    先检查下黑点出现的坐标(x,y),通过代码调试看是否被计算成黑色了 rgb=0.
    如果不是,那么有可能是还原的pitch没有正确设置引起。
    一般图片的行存储存在一个pitch长度, 假设 一个像素3个字节, 一行 100 个像素,那么每一行的byte的长度不一定是300,而是比300长。
    需要读取图片的pitch值来正确回写各个像素。

    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型