Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何创建深褐色色调?_Image Processing_Imagemagick - Fatal编程技术网

Image processing 如何创建深褐色色调?

Image processing 如何创建深褐色色调?,image-processing,imagemagick,Image Processing,Imagemagick,创建深褐色色调需要哪些基本操作?我的参考点是perl imagemagick库,因此我可以轻松地使用任何基本操作。我尝试过量化(使其灰度化)、着色,然后增强图像,但仍然有点模糊。如果使用imagemagic命令行,这很容易 转换时使用“-sepia tone threshold”参数 奇怪的是,PerlMagick API似乎没有包含直接执行此操作的方法: …并且没有参考任何Sepia方法。看看它是如何在AForge.NET库中实现的,C#代码是 最基本的似乎是 将其转换为YIQ颜色空间

创建深褐色色调需要哪些基本操作?我的参考点是perl imagemagick库,因此我可以轻松地使用任何基本操作。我尝试过量化(使其灰度化)、着色,然后增强图像,但仍然有点模糊。

如果使用imagemagic命令行,这很容易

转换时使用“-sepia tone threshold”参数

奇怪的是,PerlMagick API似乎没有包含直接执行此操作的方法:


…并且没有参考任何Sepia方法。

看看它是如何在AForge.NET库中实现的,C#代码是

最基本的似乎是

  • 将其转换为YIQ颜色空间
  • 修改它
  • 转换回RGB

源代码中有完整的程序,还解释了RGB->YIQ和YIQ->RGB转换。

C#中的乌贼色转换器示例代码在我的回答中:

算法来源于,每个输入像素颜色按以下方式变换:

outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189)
outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168)
outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131)
如果这些输出值中的任何一个大于255,只需设置它即可 到255。这些特定值是乌贼墨色调的值 微软推荐的

这是在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);

}
private void SepiaBitmap(位图bmp)
{
矩形rect=新矩形(0,0,bmp.Width,bmp.Height);
System.Drawing.Imaging.BitmapData bmpData=bmp.LockBits(rect、System.Drawing.Imaging.ImageLockMode.ReadWrite、,
系统。绘图。成像。像素格式。格式32bpprgb);
IntPtr ptr=bmpData.Scan0;
int numPixels=bmpData.Width*bmp.Height;
int numBytes=numPixels*4;
字节[]rgbValues=新字节[numBytes];
System.Runtime.InteropServices.Marshal.Copy(ptr,rgbvalue,0,numBytes);
for(int i=0;i255)
{
RGB值[i+2]=255;
}
如果((RGB值[i+1])>255)
{
RGB值[i+1]=255;
}
如果((RGB值[i+0])>255)
{
RGB值[i+0]=255;
}
}
System.Runtime.InteropServices.Marshal.Copy(rgbvalue,0,ptr,numBytes);
这个。使无效();
bmp.UnlockBits(bmpData);
}

因为我在perl中有一个imagemagick对象,这不是最直接的方法,但它可以工作。。。但是它似乎没有一个选项来为效果使用其他颜色,您可能需要使用Math.Min。我尝试在这三行之后检查255,结果会出现错误。今天早些时候,当我试图为我的程序制作一个深褐色色调时,我遇到了同样的问题。但是,如果我想要一些不同的东西来更改过滤器,那么我如何才能获得这些值呢?我的问题是,我们是如何认识这些价值观的,我们需要一次又一次地把不同的价值观放在一起吗?谢谢,使用这些价值观可以得到清晰的图像,因此,他们首先求助于转换为灰度,然后调用sepia。使用math.min和if检查255是否更大有什么意义?必须使用
math.min
将计算值钳制到字节范围。后面的
if
语句完全没有意义
rgbValues
是一个
byte
数组,因此它的任何值都不可能大于255