使用ImageMagick/perl自定义颜色反转算法

bpsygsoo  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(237)

我有一些现有的C#代码,我正在尝试将其转换为开源脚本语言。总体思路是读入PNG图像,并对其执行“自定义反转”颜色转换。
我想:

  • 只需反转所有灰度(即R=G=B)像素(使用convert +negate效果很好!)
  • 仅对所有非灰度像素的亮度取反(即亮度1变为0,.2变为.8)

迭代像素并使用Graphics::ColorObject将RGB转换为HSL可能是一个解决方案,但我为此编写的脚本非常慢,而在我的C#代码中(如果我能够在.NET环境中运行此代码,我将使用此代码),转换图像只需要一两秒钟。
我猜这是可能的一个或多个连续的convert命令(因为convert +negate很容易完成#1),但不知道如何做#2。
这是我的非常慢的Perl代码,实际上我还没有能够确定它是否工作,因为它花了太长的时间。我不是一个Perl程序员,所以我相信这可以优化几次。

#!/usr/local/bin/perl
  use Image::Magick;
  use Graphics::ColorObject;
 my $image;

$image = new Image::Magick;

$image->Read($ARGV[0]);

my $width = $image->Get('width');
my $height = $image->Get('height');
my $w = 0;
my $h = 0;

for($w=0; $w GetPixel(x=>$w,y=>$h);
                #print "checking $w $h: $r $g $b\n";
                if($r == $g && $g == $b) {
                        # grey scale - invert
                        $r = 1 - $r;
                        $g = 1 - $g;
                        $b = 1 - $b;
                } else {
                        # convert only luminance
                        $color = Graphics::ColorObject->new_RGB([$r, $g, $b]);
                        ($h, $s, $l) = @{ $color->as_HSL() };
                        $l = 1 - $l;
                        $newcolor = Graphics::ColorObject->new_HSL([$h, $s, $l]);
                        ($r, $g, $b) = @{ $newcolor->as_RGB() };
                }
                $image->SetPixel(x=>$w,y=>$h,color=>[$r, $g, $b]);
        }
}

$image->Write($ARGV[0] + "_i");
wecizke3

wecizke31#

我希望这就是您正在寻找的使用转换(在Ubuntu上使用ImageMagick完成)

~$ convert rose: -colorspace HSL -channel Luminance -negate rose_out.pnm
~$ display rose: &  display rose_out.pnm &

结果为(原始左图)

相关问题