匹配两张图片之间的颜色主导的最佳策略是什么?

2024-02-15

我需要匹配两张不同图片之间的主色,使它们尽可能相似。

例如,我想将下面孩子的灰度图片与士兵的棕褐色图片相匹配,并补偿对比度和闪电。

到目前为止,我正在考虑将图片转换为YCrCb,并匹配Y通道直方图上的对比度和其他通道中的颜色。

我也必须在彩色图片之间做同样的事情。

有什么建议么?


我有一些应该有用的想法 - 它们有点从 Photoshop 开始,然后经过 Perl、ImageMagick 和 OpenCV。我非常喜欢这样的摄影师所取得的温暖而美丽的色调大卫·福科斯 http://davidfokos.net and 迈克尔·肯纳 http://www.michaelkenna.net很多年前我就研究出了如何复制他们的色调。

首先,在 Photoshop 中加载图像,转换为黑白模式,然后返回 RGB 模式,添加曲线调整图层和包含原始彩色图像的新图层。您的图层窗口将如下所示:

现在关闭除灰色背景之外的所有图层,并使用颜色滴管查找并标记:

  • 四分色调像素(即信息窗口中 64 左右的值)
  • 中间色调像素(即信息窗口中的 128 左右)
  • 三个四分色调像素(即信息窗口中的 192 左右)

现在重新打开其他图层并找到这三种色调在 RGB 中的映射:

现在进入曲线图层并调整红色、绿色和蓝色曲线以匹配这些值:

如果您随后切换回 RGB,您可以在一张图表上看到所有三条曲线:

您现在只需将该曲线保存为文件ACV扩展名,您可以将其应用到其他图像:

我觉得这样做有点无聊,所以我写了一个 Perl 脚本来完成同样的事情。您将色调图像作为文件名传递给它,它会找到四分之一、中间和四分之三色调,然后创建一个 Adob​​e Photoshop 曲线文件 - 一个 ACV 文件,然后您可以将其批量应用到其他照片。

这是 Perl:

#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
use Data::Dumper;

my $Debug=1;    # 1=print debug messages, 0=don't
my $NPOINTS=5;  # Number of points in curve we create

# Read in image in first parameter
my $imagename=$ARGV[0];
my $orig=Image::Magick::->new;
my $x = $orig->Read($imagename);
  warn "$x" if "$x";

my $width =$orig->Get('columns');
my $height=$orig->Get('rows');
my $depth=$orig->Get('depth');
print "DEBUG: ",$width,"x",$height,", depth: ",$depth,"\n" if $Debug;

# Access pixel cache
my @RGBpixels  = $orig->GetPixels(map=>'RGB',height=>$height,width=>$width,normalize=>1);

my ($i,$j,$p);
my (@greypoint,@Rpoint,@Gpoint,@Bpoint);
for($p=0;$p<$NPOINTS;$p++){
   my $greylevelsought=int(($p+1)*256/($NPOINTS+1));
   my $nearestgrey=1000;
   for(my $t=0;$t<$height*$width;$t++){
         my $R = int(255*$RGBpixels[(3*$t)+0]);
         my $G = int(255*$RGBpixels[(3*$t)+1]);
         my $B = int(255*$RGBpixels[(3*$t)+2]);
         my $this=int(0.21*$R + 0.72*$G +0.07*$B);
         printf "Point: %d, Greysought: %d, this pixel: %d\n",$p,$greylevelsought,$this if $Debug>1;
         if(abs($this-$greylevelsought)<abs($nearestgrey-$greylevelsought)){
            $nearestgrey=$this;
            $greypoint[$p]=$nearestgrey;
            $Rpoint[$p]=$R;
            $Gpoint[$p]=$G;
            $Bpoint[$p]=$B;
         }
   }
   printf "DEBUG: Point#: %d, sought grey: %d, nearest grey: %d\n",$p,$greylevelsought,$nearestgrey if $Debug;
}

# Work out name of the curve file = image basename + acv
my $curvefile=substr($imagename,0,rindex($imagename,'.')) . ".acv";
open(my $out,'>:raw',$curvefile) or die "Unable to open: $!";
print $out pack("s>",4); # Version=4
print $out pack("s>",4); # Number of curves in file = Master NULL curve + R + G + B

print $out pack("s>",2);            # Master NULL curve with 2 points for all channels
print $out pack("s>",0  ),pack("s>",0  );   # 0 out, 0 in
print $out pack("s>",255),pack("s>",255);   # 255 out, 255 in

print $out pack("s>",2+$NPOINTS);       # Red curve
print $out pack("s>",0  ),pack("s>",0  );   # 0 out, 0 in
for($p=0;$p<$NPOINTS;$p++){
   print $out pack("s>",$Rpoint[$p]),pack("s>",$greypoint[$p]);
}
print $out pack("s>",255),pack("s>",255);   # 255 out, 255 in

print $out pack("s>",2+$NPOINTS);       # Green curve
print $out pack("s>",0  ),pack("s>",0  );   # 0 out, 0 in
for($p=0;$p<$NPOINTS;$p++){
   print $out pack("s>",$Gpoint[$p]),pack("s>",$greypoint[$p]);
}
print $out pack("s>",255),pack("s>",255);   # 255 out, 255 in

print $out pack("s>",2+$NPOINTS);       # Blue curve
print $out pack("s>",0  ),pack("s>",0  );    # 0 out, 0 in
for($p=0;$p<$NPOINTS;$p++){
   print $out pack("s>",$Bpoint[$p]),pack("s>",$greypoint[$p]);
}
print $out pack("s>",255),pack("s>",255);    # 255 out, 255 in

close($out);

如果您想在 OpenCV 中执行此操作,您可以非常简单地将脚本的前 70% 转换为 OpenCV - 它只有 2 个循环。然后你就会得到四分之一、中音和四分之三音调点。您可以使用曲线拟合程序,例如gnuplot(我不知道你的技能)将曲线拟合到点,然后为 256 个值 0-255 中的每个值生成一个查找表,并将其应用到你的其他图像中cv::LUT()复制或克隆音调。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

匹配两张图片之间的颜色主导的最佳策略是什么? 的相关文章

  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • 是否可以在 PyScript 中使用 OpenCV 模块?

    我想使用 opencv 模块 但无法导入 OpenCV 那么我该如何解决这个问题呢 顺便说一句 Pyodide 支持 OpenCV 示例代码 https i stack imgur com ahwex jpg 尚不支持 OpenCV 此时O
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

    我在 VS 2010 上构建了 OpenCV 2 2 启用了 TBB 3 支持 我确保所有项目都有正确的 tbb lib 目录 并将 tbb lib 列为依赖项 通过隐藏 tbb dll 进行验证 果然 haartraining exe 抱
  • opencv水印周围的轮廓

    我想在图像中的水印周围画一个框 我已经提取了水印并找到了轮廓 但是 不会在水印周围绘制轮廓 轮廓是在我的整个图像上绘制的 请帮我提供正确的代码 轮廓坐标的输出为 array 0 0 0 634 450 634 450 0 dtype int
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 提取二值图像中的最中心区域

    我正在处理二进制图像 之前使用此代码来查找二进制图像中的最大区域 Use the hue value to convert to binary thresh 20 thresh thresh img cv2 threshold h thre
  • 在 opencv 中一次性将旋转和平移结合起来

    我有一段用于旋转和平移图像的代码 Point2f pt 0 in rows double angle atan trans c trans b 180 M PI Mat r getRotationMatrix2D pt angle 1 0
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • CV_MAT_ELEM 中的编译错误

    调用estimateRigidTransform 的结果是我得到一个名为 trans 的cv Mat 对象 为了检索其包含的矩阵 我尝试以这种方式访问 其元素 for i 0 i lt 2 i for j 0 j lt 3 j mtx j
  • C++ OpenCV imdecode 慢

    我将图像的字节数组从 C 发送到 C 库 我使用 OpenCV 版本 3 3 1 解码图像 BMP 图像解码速度很快 但 JPEG 图像解码速度很慢 如何加快 JPEG 图像的解码时间 多线程 GPU 解码性能 Resolution For
  • opencv不失真图像有一个奇怪的圆圈

    我尝试使用 opencv 针孔模型来计算校准参数 然后使图像不失真 问题是 未失真的图像中有一个奇怪的圆圈 如下所示 代码 原始图像和结果图像是here https github com wennycooper A004 pinhole 任

随机推荐

  • “Timer”上的错误是“System.Windows.Forms.Timer”和“System.Threading.Timer”之间的引用不明确

    我遇到过这个 NET编译时错误 如下所示 Timer is an ambiguous reference between System Windows Forms Timer and System Threading Timer 它是在我为
  • Scala:收集不可变状态的更新/更改

    我目前正在尝试将更实用的编程风格应用于涉及低级 基于 LWJGL GUI 开发的项目 显然 在这种情况下 有必要携带大量状态 而这些状态在当前版本中是可变的 我的目标是最终拥有一个完全不可变的状态 以避免状态更改带来的副作用 我研究了 sc
  • 上传图片至 Facebook

    我正在尝试将图像上传到 Facebook 粉丝页面上的画廊 这是迄今为止我的代码 ch curl init data array type gt client cred client id gt app id client secret g
  • 批处理文件:返回调用者?

    相当于什么return批处理文件子程序的语句 It is goto eof 对于习惯普通编程语言的人来说 这是不寻常的 这是可以理解的 我找到了这个信息here http www robvanderwoude com call php
  • 使用 pugixml 将现有 xml_node 附加到另一个节点

    如何追加现有的pugi xml node使用 pugixml 进入另一个 我知道的唯一功能是 pugi xml node node root append child child 您应该使用此处描述的克隆功能 http pugixml or
  • 如何让 BOOST_TEST_MESSAGE 显示在屏幕上?

    我正在摸索着 Boost 单元测试框架 并建立了一个基本的功能单元测试 我在用着BOOST TEST MESSAGE让用户知道哪些测试正在运行 但消息不会显示在屏幕上 例如 define BOOST TEST MODULE MyTest i
  • Mysql 从日期时间中剥离时间部分

    我需要在 Mysql 中进行日期比较 而不考虑时间部分 即我需要将 2008 11 05 14 30 00 转换为 2008 11 05 目前我正在这样做 SELECT from days to days my date 有没有正确的方法来
  • 如何获取 woocommerce 国家/地区选择下拉菜单?

    我想在网站上的某些位置显示 woocommerce 国家 地区列表 我如何获得像这样的国家 地区列表作为图像 是的 您可以通过在您想要的任何地方添加以下代码来实现此目的 global woocommerce countries obj ne
  • 无法在 Ubuntu 10.04 上安装 rJava 0.9

    我使用 Ubuntu 10 04 的 CRAN apt 存储库中的 R 2 13 并且我正在尝试安装 Deducer 它需要 JGR rJava 但 rJava 拒绝构建 安装 抱怨无法构建 JNI 应用程序 我试过sudo R CMD j
  • 如何指定用户拥有通过 docker-compose 配置创建的卷?

    我有以下内容docker compose yml version 3 7 services xxx container name xxx image xxx volumes config some mountpoint user 1000
  • 如何在 ASP 形式的 MVC Core 上使用日期选择器

    在我的 MVC 核心 Web 应用程序中 我没有在所有浏览器上看到日期选择器 因此我想使用 jQuery 日期选择器 目前在我的模型中我有 Required Display Name RegisterDate DisplayFormat A
  • 使用 dplyr contains() 根据多个字符串选择列

    我想根据名称选择多个列regex表达 我正在尝试使用管道语法来做到这一点dplyr包裹 我检查了其他主题 但只找到了有关单个字符串的答案 以 R 为基数 library dplyr mtcars grepl m ar names mtcar
  • Spring Boot + Eclipse + Weblogic 12.2.1

    当我通过 Eclipse Neon 在 weblogic 12 2 1 中部署 Spring Boot 应用程序时遇到问题 这是组件 具有 Web 依赖的简单 Spring Boot 应用程序 日食霓虹灯 Weblogic 12 2 1 1
  • 如何在 Android 上重置 viewpager 内容?

    请告诉我如何在 android 上重置 ViewPager 的内容 我尝试调用adapter notifyDataSetChanged 但当我滚动视图时适配器不会调用getItem position 它总是返回旧的子视图 更新 这是我的片段
  • Python 继承中共享类变量

    我对Python继承中的变量共享概念感到困惑 考虑以下代码 class a object var1 0 var2 def print var self print self var1 print self var2 class b a cl
  • 图论中的盒子堆叠

    请帮我找到解决这个问题的好方法 我们有 n 个 3 维的盒子 我们可以调整它们的方向 并且希望将它们放在另一个之上以获得最大高度 如果两个尺寸 宽度和长度 小于下面盒子的尺寸 我们可以将一个盒子放在另一个盒子的顶部 例如 我们有 3 个维度
  • 如何强制 ListBox 重新加载 ListBoxItems 的属性

    有什么方法可以强制 ObservableCollection 触发 CollectionChanged 吗 我有一个 ObservableCollection 对象ListBox项目源 因此每次我向集合中添加 删除项目时 ListBox 都
  • ListFragment 相对于 ListView 或普通 Fragment 的优势

    我有一个活动 其中左侧的项目菜单是文本视图 当用户选择其中一个 textView 时 它会将一个 listView 放置在占据屏幕另外 2 3 的 Activity 的其余区域中 当用户触摸页面左侧菜单上的不同 textView 时 它将打
  • 为什么重载方法中enum参数不能接受int值(>0)

    这是我的代码 public class Program public enum SexEnum Male Female public static void Test SexEnum s Console WriteLine enum pub
  • 匹配两张图片之间的颜色主导的最佳策略是什么?

    我需要匹配两张不同图片之间的主色 使它们尽可能相似 例如 我想将下面孩子的灰度图片与士兵的棕褐色图片相匹配 并补偿对比度和闪电 到目前为止 我正在考虑将图片转换为YCrCb 并匹配Y通道直方图上的对比度和其他通道中的颜色 我也必须在彩色图片