图片的处理,一张比较简单的图片, 用扫描仪扫描入去后。 基于此图片内容比较有规律, 所以想实现加工。
(图片里面所有点的像素都是黑色)
图片内容: 
长度与宽度都相同的矩形(设宽度为1,长度为2),排成一直线段。 每一个矩形之间的距离为2
形如: ---   ---   ---   ---   ---  (这里只能表示长度出来,没有显示宽度)但是因为扫描仪,以及原来图片的质量等各方便的原因, 扫描出来的图像肯定会这里一个黑点, 那里一个黑点, 本来应该黑色的, 显示出来的是白色。加工目标如下:把那些疏散的黑点给去掉, 应该黑色的点补回上去。 在人的视觉看上去就好像真的用图像工具软件画上去一样( 与这种效果差不多)请问应该怎样实现 

解决方案 »

  1.   

    这个东西有点象反抖动,提供一个简单可行的办法供考虑:
    原则就是任何一点的根据它周围各点(包括自身)的值决定,至于取2x2,3x3,5x5,...,请根据你的扫描图的结果取一个阀值。
    比如,取5x5矩阵,如果1个点周围有5个或5个以上黑点,则它取黑点,否则取白点
      

  2.   

    这里说的灰度是亮度,简单取亮度可以用这种方法:
    Y = (R + G + B)\3因为人眼对R、G、B三种颜色的视觉强度不同,准确的方法是这样的:
    Y = R * 0.299 + G * 0.587 + B * 0.114得到所有像素的亮度,你也就得到了一副该图片的亮度平面(平面是像素某分量的集合)。该灰度图片是8bit的。接着,你要对灰度图片做两值化处理。也就是使图片只存在黑色和白色。两值化一个重要参数是阀值,亮度大于阀值的是白色,小于阀值是黑色。取得阀值的依据是直方图,直方图是每个亮度在图片中出现次数的统计。假设你得到了图片的亮度平面,储存在一个数组Y()中。尽管图片是二维的,但保存它的数组却可以是一维的。某像素点在一维数组位置为I,则I=Y*Width+X。首先定义一个新的数组,该数组保存亮度直方图N()中。N(Y(i))=N(Y(i))+1简单说,直方图是用来统计每个亮度值在图片内出现的次数。如果亮度129这个值在图片里出现了1131次,则直方图元素129的值为1131。对于接近两个亮度的图片,直方图呈现为双峰形。
    极端的情况下(只有黑色和白色),则是两根直线。两个山峰之间的谷底就是阀值的最佳点。但不幸的是,由于你的图片可能存在一些不均匀的亮度,因此直方图可能存在比较大的抖动。想自动取得阀值,就需要对直方图做拉普拉斯滤波和一系列运算。取得阀值,并且对图片做两值化处理后,就可以进一步进行开运算和闭运算。首先你要知道什么是膨胀和腐蚀。边缘点的扩张是膨胀、收缩则是腐蚀。什么是边缘点呢?当某点周围存在与该点不同的像素时,该点就是边缘点。腐蚀、膨胀是针对某一值来说的。比如,对于黑色,将所有边缘点设置为黑色,则是黑色的膨胀。将所有边缘点设置为白色,则是黑色的腐蚀。先腐蚀后膨胀为开运算,消除外部的细小点。先膨胀后腐蚀为闭运算,消除内部的细小点。