.NET CORE ImageSharp 圖像二值化

最近做到電子價籤顯示用的圖像處理,電子價籤的屏幕只能顯示黑白紅三色,這就需要對原始圖像進行二值化,再取紅色點,兩層圖層疊加後傳輸給電子價籤顯示。下圖爲處理效果,具體還可以通過代碼調整閾值來調整效果。

代碼如下:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using SixLabors.Primitives;
using System;

namespace ImageConvterTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int imgindex = 3;//圖像編號
            var fImageTemp = Image.Load(System.IO.File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + $"/img/{imgindex}.jpg"));
            var fBImg = Binaryzation(fImageTemp);
            fBImg.Save(AppDomain.CurrentDomain.BaseDirectory + $"/img/{imgindex}Binaryzation.jpg");
            var fImageTemp2 = Image.Load(System.IO.File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + $"/img/{imgindex}.jpg"));
            //紅色圖像提取
            var fBImgColor = BinaryzationRed(fImageTemp2, 120, 70, 70);
            fBImgColor.Save(AppDomain.CurrentDomain.BaseDirectory + $"/img/{imgindex}Red.jpg");
            //合成圖像
            fBImg.Mutate(p =>
            {
                p.DrawImage(fBImgColor, new Point(0, 0), 1);
            });
            fBImg.Save(AppDomain.CurrentDomain.BaseDirectory + $"/img/{imgindex}Final.jpg");
        }

        /// <summary>
        /// 黑白二值化
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        public static Image<Rgba32> Binaryzation(Image<Rgba32> image)
        {
            image = ToGray(image);//先灰度處理
            int threshold = 180;//定義閾值
            for (int i = 0; i < image.Width; i++)
            {
                for (int j = 0; j < image.Height; j++)
                {
                    //獲取該像素點的RGB的顏色
                    var color = image[i, j];
                    //計算顏色,大於平均值爲黑,小於平均值爲白
                    System.Drawing.Color newColor = color.B < threshold ? System.Drawing.Color.FromArgb(0, 0, 0) : System.Drawing.Color.FromArgb(255, 255, 255);
                    //修改該像素點的RGB的顏色
                    image[i, j] =new Rgba32(newColor.R, newColor.G, newColor.B, newColor.A);
                }
            }
            return image;
        }

        /// <summary>
        /// 圖像灰度處理
        /// </summary>
        /// <param name="img"></param>
        /// <returns></returns>
        public static Image<Rgba32> ToGray(Image<Rgba32> img)
        {
            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {
                    var color = img[i, j];
                    //計算灰度值
                    int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
                    System.Drawing.Color newColor = System.Drawing.Color.FromArgb(gray, gray, gray);
                    //修改該像素點的RGB的顏色
                    img[i, j] = new Rgba32(newColor.R, newColor.G, newColor.B, newColor.A);
                }
            }
            return img;
        }

        /// <summary>
        /// 圖像紅色處理
        /// </summary>
        /// <param name="image"></param>
        /// <param name="r"></param>
        /// <param name="g"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static Image<Rgba32> BinaryzationRed(Image<Rgba32> image,int r,int g,int b)
        {
            for (int i = 0; i < image.Width; i++)
            {
                for (int j = 0; j < image.Height; j++)
                {
                    //獲取該像素點的RGB的顏色
                    var color = image[i, j];
                    //計算顏色,大於平均值爲黑,小於平均值爲白
                    if (color.R >= r && color.G<=g&& color.B<=b)
                    { //修改該像素點的RGB的顏色
                        image[i, j] = Rgba32.Red;
                    }
                    else
                    {
                        image[i, j] = Rgba32.Transparent;
                    }
                }
            }
            return image;
        }
    }
}

 

發佈了70 篇原創文章 · 獲贊 81 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章