图片灰度转换,二值化,分割(剪切)

一,图片灰度转换后,体积会缩小,亦可当作压缩方法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace WFA2练习
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Bitmap bit1;//位图图片

        private void button1_Click(object sender, EventArgs e)
        {
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = this.openFileDialog1.FileName;//获得图片路径
                bit1 = new Bitmap(path);//将图片转化为位图
                this.pictureBox1.Image = bit1;

            }
        }
        //灰度转换方法,循环处理每个像素点
        private void button2_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image!=null)
            {
                Color c = new Color();
                Bitmap b1 = new Bitmap(pictureBox1.Image);//实例化b1,作为处理后图片
                int rr, gg, bb, cc;//r,g,b颜色值与平均值
                //x坐标循环
                for (int i = 0; i < bit1.Width; i++)
                {
                    //y坐标循环
                    for (int j = 0; j < bit1.Height; j++)
                    {
                        c = bit1.GetPixel(i, j);//获取(i,j)点的颜色信息
                        rr = c.R;//红色值
                        gg = c.G;
                        bb = c.B;
                        cc = (int)((rr + gg + bb) / 3);//平均值
                        //去除超过界限外的值
                        if (cc < 0)
                            cc = 0;
                        if (cc > 255)
                            cc = 255;
                        //用FromArgb把整形转换成颜色值,灰度转换。
                        Color c1 = Color.FromArgb(cc, cc, cc);
                        b1.SetPixel(i, j, c1);
                    }
                        //pictureBox2.Refresh();这两行,放在这里是逐行刷新显示,容易理解,但显示速度慢
                        //pictureBox2.Image = b1;
                        //b1.Save(@"C:\Users\Administrator\Desktop\gray.jpg");
                }
                    pictureBox2.Refresh();//放在这里,就很快
                    pictureBox2.Image = b1;
                    b1.Save(@"C:\Users\Administrator\Desktop\gray.jpg");
            }
        }
    }
}

[引用博客内容](http://blog.sina.com.cn/s/blog_4b3485000100u0uz.html

二,图片二值化方法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace WFA2练习
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Bitmap bit1;//上提示图片(图片1)

        private void button1_Click(object sender, EventArgs e)
        {
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = this.openFileDialog1.FileName;//获得图片路径
                bit1 = new Bitmap(path);
                this.pictureBox1.Image = bit1;

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image!=null)
            {
                Color c = new Color();
                //Bitmap b = new Bitmap(pictureBox1.Image);
                Bitmap b1 = new Bitmap(pictureBox1.Image);
                int rr, gg, bb, cc;

                for (int i = 0; i < bit1.Width; i++)
                {

                    for (int j = 0; j < bit1.Height; j++)
                    {
                        c = bit1.GetPixel(i, j);
                        rr = c.R;
                        gg = c.G;
                        bb = c.B;
                        cc = (int)((rr + gg + bb) / 3);
                        if (cc < 0)
                            cc = 0;
                        if (cc > 255)
                            cc = 255;
                        //二值化方法,阈值可以根据图片颜色分布进行设置
                        if (cc < 127)
                            cc = 0;
                        if (cc > 127)
                            cc = 255;
                        //用FromArgb把整形转换成颜色值,第一个变量255是透明度
                        Color c1 = Color.FromArgb(255,cc,cc,cc);
                        b1.SetPixel(i, j, c1);
                    }
                        //pictureBox2.Refresh();
                        //pictureBox2.Image = b1;
                        //b1.Save(@"C:\Users\Administrator\Desktop\gray.jpg");
                }
                    pictureBox2.Refresh();
                    pictureBox2.Image = b1;
                    b1.Save(@"C:\Users\Administrator\Desktop\gray.jpg");
            }
        }
    }
}
三,分割图片(内容非粘连,只适用于背景相同或相近图片)

分割内容非粘连图片,可以利用图片直方图属性,设置y方向阈值来区分有内容部分与空白部分,示例如下
剪切方法参考自iteye,coolszy博客

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
//剪切图片添加
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; 

namespace WFA2练习
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Bitmap bit1;//上提示图片(图片1)
        //全局变量
        //Wh1是x方向第一个阈值分割点
        int Wh1,Wh2;
        //count是在第一个阈值分割点之后多少像素,进行剪切的x坐标
        int Count;
        //统计每一列颜色总值
        int ColumnColorSum;
        //统计每一列颜色平均值
        int ColumnColorEvr;

        private void button1_Click(object sender, EventArgs e)
        {
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = this.openFileDialog1.FileName;//获得图片路径
                bit1 = new Bitmap(path);
                this.pictureBox1.Image = bit1;

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image!=null)
            {
                Color c = new Color();
                Bitmap b1 = new Bitmap(pictureBox1.Image);
                int rr, gg, bb, cc;
                for (int i = 50; i < bit1.Width; i++)
                {
                    ColumnColorSum = 0;
                    for (int j = 0; j < bit1.Height; j++)
                    {
                        c = bit1.GetPixel(i, j);
                        rr = c.R;
                        gg = c.G;
                        bb = c.B;
                        cc = (int)((rr + gg + bb) / 3);
                        //灰度转化方法
                        if (cc < 0)
                            cc = 0;
                        if (cc > 255)
                            cc = 255;
                        ColumnColorSum += cc;
                        //二值化方法
                        //if (cc < 127)
                        //    cc = 0;
                        //if (cc > 127)
                        //    cc = 255;
                        //用FromArgb把整形转换成颜色值
                        //Color c1 = Color.FromArgb(255,cc,cc,cc);
                        //b1.SetPixel(i, j, c1);
                    }
                    //经过上述循环,对图片逐列扫描,统计颜色总值与平均值。
                    ColumnColorEvr = (int)(ColumnColorSum / bit1.Height);
                    //设置图片直方图阈值,可根据图片色调进行调整,在阈值分割点后的第20个像素,进行分割操作
                    if (ColumnColorEvr>210)
                    {
                        Count++;
                        while (Count>20)
                        {
                            Wh1 = i;
                            Count = 0;
                            goto case1;
                        }
                    }
                }
            //使用Wh1的坐标剪切图片
            case1:
                Bitmap bit0 = Cut(bit1,0,0,Wh1,bit1.Height);
            pictureBox2.Image = bit0;
                Bitmap bit = Cut(bit1,Wh1,0,bit1.Width,bit1.Height);
                pictureBox3.Image = bit;
            }
        }

        //剪切图片方法(函数)
        public static Bitmap Cut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight)
        {
            if (b == null)
            {
                return null;
            }
            int w = b.Width;
            int h = b.Height;
            if (StartX >= w || StartY >= h)
            {
                return null;
            }
            if (StartX + iWidth > w)
            {
                iWidth = w - StartX;
            }
            if (StartY + iHeight > h)
            {
                iHeight = h - StartY;
            }
            try
            {
                Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bmpOut);
                g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
                g.Dispose();
                return bmpOut;
            }
            catch
            {
                return null;
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 处理之后的效果: 处理之后的效果: Demo地址:https://github.com/yuying2012/WJ...
    雨影阅读 6,607评论 3 9
  • 给自己的总是很多期待,期待更多的美好的回忆,我不要现在,不求飞黄腾达,只求让自己心安理得的面对很多事情,秋天一转眼...
    一个人的光阴阅读 363评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,515评论 25 707
  • 在此特此声明:一下所有链接均来自互联网,在此记录下我的查阅学习历程,感谢各位原创作者的无私奉献 ! 技术一点一点积...
    远航的移动开发历程阅读 11,078评论 12 197
  • 时间一滴一点 白天黑夜准时出现 情绪陪在身边 正面负面 没绝对喜厌 原谅我认生观 向往真实新鲜感 自己一遍遍默默交...
    晓歌阅读 133评论 0 0