【问题标题】:Making a metric between colors (perception model) with "difference"用“差异”在颜色(感知模型)之间建立度量
【发布时间】:2014-09-01 15:48:49
【问题描述】:

看看下面的图片。如果你不是色盲,你应该看到一些 A 和 B。图像中有3个A和3个B,它们都有一个共同点:它们的颜色是背景+valuesaturation的10%色调,按此顺序。对于大多数人来说,中心字母很难看到 - 饱和似乎没有多大作用!

这有点麻烦,因为我正在制作一些字符识别软件,并且我正在根据 known foregroundbackground 颜色。但有时它们非常接近,而图像嘈杂。为了确定一个像素属于字母还是背景,我的程序检查了欧几里得 RGB 距离:

(r-fr)*(r-fr) + (g-fg)*(g-fg) + (b-fb)*(b*fb) < 
(r-br)*(r-br) + (g-bg)*(g-bg) + (b-bb)*(b*bb) 

这很好用,但对于近距离的背景和前景,有时效果很差。

是否有一些更好的指标可供寻找?我研究了颜色感知模型,但那些主要是模型 brightness 而不是我正在寻找的感知 difference。也许是一种将饱和度建模为不太有效的模型,以及某些色调差异?任何指向一些有趣指标的指针都会非常有用。

【问题讨论】:

标签: colors artificial-intelligence perception


【解决方案1】:

正如在 cmets 中提到的,答案是使用感知色彩空间,但我想我会拼凑一个视觉示例,说明边缘检测在两个色彩空间中的行为方式。 (代码在最后。)在这两种情况下,都是对3通道彩色图像进行Sobel边缘检测,然后将结果展平为灰度。

RGB 空间:

L*a*b 空间(图像是对数的,因为第三个字母的边缘比第一个字母的边缘更重要,第一个字母的边缘比第二个字母的边缘更重要):

OpenCV C++ 代码:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "iostream"

using namespace cv;
using namespace std;

void show(const char *name, Mat &img, int dolog=0)
{
  double minVal, maxVal;
  minMaxLoc(img, &minVal, &maxVal);
  cout << name << " " << "minVal : " << minVal << endl << "maxVal : " << maxVal << endl;

  Mat draw;
  if(dolog) {
    Mat shifted, tmp;
    add(img, minVal, shifted);
    log(shifted, tmp);
    minMaxLoc(tmp, &minVal, &maxVal);
    tmp.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));
  } else {
    img.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));
  }

  namedWindow(name, CV_WINDOW_AUTOSIZE);
  imshow(name, draw);
  imwrite(name, draw);
}

int main( )
{
    Mat src;
    src = imread("AAABBB.png", CV_LOAD_IMAGE_COLOR);
    namedWindow( "Original image", CV_WINDOW_AUTOSIZE );
    imshow( "Original image", src );

    Mat lab, gray;
    cvtColor(src, lab, CV_BGR2Lab);

    Mat sobel_lab, sobel_bgr;
    Sobel(lab, sobel_lab, CV_32F, 1, 0);
    Sobel(src, sobel_bgr, CV_32F, 1, 0);

    Mat bgr_sobel_lab, gray_sobel_lab;
    cvtColor(sobel_lab, bgr_sobel_lab, CV_Lab2BGR);
    show("lab->bgr edges.png", bgr_sobel_lab, 1);
    cvtColor(bgr_sobel_lab, gray_sobel_lab, CV_BGR2GRAY);

    Mat gray_sobel_bgr;
    cvtColor(sobel_bgr, gray_sobel_bgr, CV_BGR2GRAY);

    show("lab edges.png", gray_sobel_lab, 1);
    show("bgr edges.png", gray_sobel_bgr);

    waitKey(0);                                        
    return 0;
} 

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2018-07-16
    • 2011-10-11
    相关资源
    最近更新 更多