C# 判断一张图片是否是空白图片

作者:超级管理员 更新时间:2017-09-13 09:57:55 来源:未知 点击:15642
平时做文件扫描存档,一般都是双面扫描.扫描之后,需要存档,有些背面空白的,需要剔除.因为扫描仪设备比较老旧,没法自动剔除.所以,想问问,用程序来判断,怎么处理?例如下面几张图片,该怎么处理?第一张是空
平时做文件扫描存档,一般都是双面扫描.扫描之后,需要存档,有些背面空白的,需要剔除.因为扫描仪设备比较老旧,没法自动剔除.所以,想问问,用程序来判断,怎么处理?例如下面几张图片,该怎么处理?第一张是空白的,但是,扫描之后,有些灰色的点在,不是很白.第二张是有内容的.

以下是关于本问题的解决方案:

解决方案1、
求助各位大神!
解决方案2、
用直方图判断吧
解决方案3、
标题所在区域是相对固定的,你只要判断该区域像素分布就可以了
解决方案4、
引用 2 楼 homesos 的回复:
用直方图判断吧

可以给点代码提示吗?不是很明白你的意思
解决方案5、
引用 3 楼 xuzuning 的回复:
标题所在区域是相对固定的,你只要判断该区域像素分布就可以了

像素分布?不知道怎么判断,可否方便给一段代码提示一下?谢谢版主
解决方案6、
就是统计一下指定区域中各种颜色的点出现的次数
解决方案7、
引用 6 楼 xuzuning 的回复:
就是统计一下指定区域中各种颜色的点出现的次数

那如果是因为扫描出来的电子版,里面有些灰色的像素,这些怎么排除呢?
解决方案8、
引用 4 楼 jeffrey9061 的回复:
Quote: 引用 2 楼 homesos 的回复:

用直方图判断吧

可以给点代码提示吗?不是很明白你的意思


http://www.cnblogs.com/zxlovenet/p/3535712.html
视频上经常会使用直方图做质量诊断,直方图你可以百度一下,原理和统计过程比较简单,上面的URL有说明和源码下载,你这样两种图的直方图区别应该很明显,你统计完把数据比较一下,找到区别点,就知道怎么区分是否为空白了。
解决方案9、
灰度,二值化,滤波,去杂点,统计聚点数量
解决方案10、
整张图像素叠加取个平均数,不就完了,还有更简单的么???杂点而已,你又不尽兴图片分析,滤波都省了。。。
解决方案11、
引用 9 楼 wowfiowow 的回复:
灰度,二值化,滤波,去杂点,统计聚点数量

可否提供一下联系方式,有偿请教
解决方案12、
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Load("/_plugin/tool/img?url=aHR0cDovL2ltZy5iYnMuY3Nkbi5uZXQvdXBsb2FkLzIwMTcwOS8wOS8xNTA0OTUwNzEyXzQxNzM5NS5qcGc%3D");
            pictureBox2.Load("/_plugin/tool/img?url=aHR0cDovL2ltZy5iYnMuY3Nkbi5uZXQvdXBsb2FkLzIwMTcwOS8wOS8xNTA0OTUwNzE5XzkzMzQ2LnBuZw%3D%3D");

            //var g = Graphics.FromImage(pictureBox2.Image);
            //g.DrawRectangle(Pens.Red, new Rectangle(60, 10, 410, 100));
            var d1 = new Dictionary<Color, int>();
            var m = (410 - 60) * (100 - 10);
            var num1 = 0;
            var num2 = 0;
            for (var x = 60; x < 410; x++)
            {
                for (var y = 10; y < 100; y++)
                {
                    if ((pictureBox1.Image as Bitmap).GetPixel(x, y).GetBrightness() < 0.2) num1++;
                    if ((pictureBox2.Image as Bitmap).GetPixel(x, y).GetBrightness() < 0.2) num2++;
                }
            }
            label1.Text = string.Format("{0} {1}",m, num1);
            label2.Text = string.Format("{0} {1}",m, num2);
        }

解决方案13、
引用 12 楼 xuzuning 的回复:
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Load("/_plugin/tool/img?url=aHR0cDovL2ltZy5iYnMuY3Nkbi5uZXQvdXBsb2FkLzIwMTcwOS8wOS8xNTA0OTUwNzEyXzQxNzM5NS5qcGc%3D");
            pictureBox2.Load("/_plugin/tool/img?url=aHR0cDovL2ltZy5iYnMuY3Nkbi5uZXQvdXBsb2FkLzIwMTcwOS8wOS8xNTA0OTUwNzE5XzkzMzQ2LnBuZw%3D%3D");

            //var g = Graphics.FromImage(pictureBox2.Image);
            //g.DrawRectangle(Pens.Red, new Rectangle(60, 10, 410, 100));
            var d1 = new Dictionary<Color, int>();
            var m = (410 - 60) * (100 - 10);
            var num1 = 0;
            var num2 = 0;
            for (var x = 60; x < 410; x++)
            {
                for (var y = 10; y < 100; y++)
                {
                    if ((pictureBox1.Image as Bitmap).GetPixel(x, y).GetBrightness() < 0.2) num1++;
                    if ((pictureBox2.Image as Bitmap).GetPixel(x, y).GetBrightness() < 0.2) num2++;
                }
            }
            label1.Text = string.Format("{0} {1}",m, num1);
            label2.Text = string.Format("{0} {1}",m, num2);
        }

版主威武!!!
测试之后,发现的确可以通过此方法来判断是否是空白图片.
至于还有一事,想请教一下版主,就是,这一段代码里面的数值,代表什么意思?可否解释一下
var m = (410 - 60) * (100 - 10);   这里的410,60,100,10分别代表什么,为什么这么设定?可否代替为图片的大小?
解决方案14、
如果检查的是整个图片,那当然是可以的,但因为像素较多,速度要慢很多
所以我在 #2 就说 标题所在区域是相对固定的,只要判断该区域像素分布就可以了
空白图像的标题区肯定也是空白的,所以代码中只对 Rectangle(60, 10, 410, 100));这个矩形区域(假想的标题区域)进行检查
(410 - 60) * (100 - 10)就是所检查的像素个数
解决方案15、
引用 12 楼 xuzuning 的回复:
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Load("/_plugin/tool/img?url=aHR0cDovL2ltZy5iYnMuY3Nkbi5uZXQvdXBsb2FkLzIwMTcwOS8wOS8xNTA0OTUwNzEyXzQxNzM5NS5qcGc%3D");
            pictureBox2.Load("/_plugin/tool/img?url=aHR0cDovL2ltZy5iYnMuY3Nkbi5uZXQvdXBsb2FkLzIwMTcwOS8wOS8xNTA0OTUwNzE5XzkzMzQ2LnBuZw%3D%3D");

            //var g = Graphics.FromImage(pictureBox2.Image);
            //g.DrawRectangle(Pens.Red, new Rectangle(60, 10, 410, 100));
            var d1 = new Dictionary<Color, int>();
            var m = (410 - 60) * (100 - 10);
            var num1 = 0;
            var num2 = 0;
            for (var x = 60; x < 410; x++)
            {
                for (var y = 10; y < 100; y++)
                {
                    if ((pictureBox1.Image as Bitmap).GetPixel(x, y).GetBrightness() < 0.2) num1++;
                    if ((pictureBox2.Image as Bitmap).GetPixel(x, y).GetBrightness() < 0.2) num2++;
                }
            }
            label1.Text = string.Format("{0} {1}",m, num1);
            label2.Text = string.Format("{0} {1}",m, num2);
        }


经过自己测试,发现,把410换成图片的宽度,100换为图片的高度,即可解决.而且,基本准确率达到99%,只需要把num为200以下的,基本能把噪点去掉,谢谢版主,现在结帖,谢谢各位的帮忙!

推荐阅读

热门内容

关于对文件名使用 string.Repl

这里我用replace()想要让文件名变...

wpf的keydown事件

页面只有这句话       ...

ASP.NET MVC验证表单

代码如下        [Require...

EasyUi Datagrid+Deta

各位牛人,有没有做过类似的功能效果,Ea...

c#串口程序界面卡死问题

 private void sp_Dat...

C# 判断一张图片是否是空白图片

平时做文件扫描存档,一般都是双面扫描.扫...

我在Winform中修改WebBrows

我在Winform中修改WebBrows...

c# 引用webservice 出现问题

我在浏览器浏览没问题就是在项目中添加服务...

有人这么黑易语言,连我都看不下去了

本帖最后由caozhy于2017-09-...

窗体加载时,代码未执行完就弹出了窗体

不知道是这样写不合理,还是我哪里写错了呢...

最新内容

关于对文件名使用 string.Replace() 没有作用 请教

这里我用replace()想要让文件名变成E:\CloudMusic\薛之谦 -...

以下代码实现的单例模式有什么缺陷?如果有,请做出你的修改!

public sealed class Singleton       stat...

wpf的keydown事件

页面只有这句话         

ASP.NET MVC验证表单

代码如下        [Required(ErrorMessage = "标题...

以XX开头的标识符太长,最大长度为128

本帖最后由qz6412525于2017-09-1212:09:14编辑如题,是一...

分部声明包含冲突的可访问性修饰符

代码如下:namespace ConstDefinitionLib{    pu...

关于 查询语句 中select 索引问题

string[] fruits = { "apple", "banana", "...

EasyUi Datagrid+DetailView 如何让他默认全部展开

各位牛人,有没有做过类似的功能效果,EasyUI DataGrid+Detail...

c#串口程序界面卡死问题

 private void sp_DataReceived(object sen...

浏览器内核问题

请问有谁会使用vs2013,用c#或vb编写在winform里面嵌一个谷歌浏览器...

LINQ to Entities 不识别方法“System.DateTime AddMinutes(Double)”,因此该方法无法转换为存储表达式。

代码如下,求大神帮忙看看:                    DateTim...

mvc 怎么执行mysql里的存储过程

我的连接是这样的。 public class mysqlconn : DbCon...

C# 判断一张图片是否是空白图片

平时做文件扫描存档,一般都是双面扫描.扫描之后,需要存档,有些背面空白的,需要剔...

我在Winform中修改WebBrowser控件修改User-Agent的方法貌似对WebkitBrowser无效,我已经修改为手机了

我在Winform中修改WebBrowser控件修改User-Agent的方法貌...

RawSocket抓包时,如果是正在传文件,则丢包严重的吓人

50M的文件传输,只抓到100-200KB。public void Run() ...

如何让Toast占满整个屏幕(包含状态栏)

本帖最后由sixsun1989于2017-09-1221:15:38编辑    ...

不熬夜看这里 苹果发布会直播全程回顾

        想必今天一早醒来,你的朋友圈和新闻头条一定都会被昨晚科技圈的大事...

网友心声有求必应 苹果同传四川话版

         在苹果秋季发布会开始前两周,我们针对网友喜欢听什么地方方言做过...

iPhone X演示出重大失误?背后另有真相

    中关村在线消息:苹果公司于美国西部时间9月12日上午10点(北京时间9月...

全视曲面商务旗舰 三星Note 8今晚发布

    中关村在线消息: 备受大家期待的三星新旗舰Note 8将于今晚18时在北...