创建棕褐色调需要什么基本操作?我的参考点是perl imagemagick库,所以我可以轻松使用任何基本操作。我试图量化(使其灰度),着色,然后增强图像,但它仍然有点模糊。
答案 0 :(得分:23)
C#中的棕褐色转换器的示例代码可在我的答案中找到:What is wrong with this sepia tone conversion algorithm?
算法来自this page,每个输入像素颜色按以下方式转换:
outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189)
outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168)
outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131)
如果这些输出值中的任何一个大于255,则只需设置它即可 这些特定值是棕褐色调的值 微软推荐。
答案 1 :(得分:4)
这是在C#中,但基本概念是相同的。您可能会将其转换为perl。
private void SepiaBitmap(Bitmap bmp)
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format32bppRgb);
IntPtr ptr = bmpData.Scan0;
int numPixels = bmpData.Width * bmp.Height;
int numBytes = numPixels * 4;
byte[] rgbValues = new byte[numBytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, numBytes);
for (int i = 0; i < rgbValues.Length; i += 4)
{
rgbValues[i + 2] = (byte)Math.Min((.393 * red) + (.769 * green) + (.189 * (blue)), 255.0); //red
rgbValues[i + 1] = (byte)Math.Min((.349 * red) + (.686 * green) + (.168 * (blue)), 255.0); //green
rgbValues[i + 0] = (byte)Math.Min((.272 * red) + (.534 * green) + (.131 * (blue)), 255.0); //blue
if ((rgbValues[i + 2]) > 255)
{
rgbValues[i + 2] = 255;
}
if ((rgbValues[i + 1]) > 255)
{
rgbValues[i + 1] = 255;
}
if ((rgbValues[i + 0]) > 255)
{
rgbValues[i + 0] = 255;
}
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, numBytes);
this.Invalidate();
bmp.UnlockBits(bmpData);
}
答案 2 :(得分:1)
如果使用imagemagic命令行,则很容易。
http://www.imagemagick.org/script/convert.php
转换时使用“-sepia-tone threshold”参数。
奇怪的是,PerlMagick API似乎没有包含直接执行此操作的方法:
http://www.imagemagick.org/script/perl-magick.php
......并且没有提及任何深褐色方法。
答案 3 :(得分:1)
看看它是如何在AForge.NET库中实现的,C#代码是here。
基础似乎是
完整的alrogithm在源代码中,加上RGB - &gt; YIQ和YIQ - &gt;解释了RGB变换。