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