Проверьте, превышает ли средний цвет внутри контура значение [дубликат]

Попробуйте

<?php
$to = "somebody@example.com, somebodyelse@example.com";
$subject = "HTML email";

$message = "
    <html>
    <head>
       <title>HTML email</title>
    </head>
    <body>
      <p>This email contains HTML Tags!</p>
      <table>
        <tr>
         <th>Firstname</th>
         <th>Lastname</th>
        </tr>
        <tr>
          <td>John</td>
          <td>Doe</td>
        </tr>
      </table>
    </body>
    </html>";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// More headers
$headers .= 'From: <webmaster@example.com>' . "\r\n";
$headers .= 'Cc: myboss@example.com' . "\r\n";

mail($to,$subject,$message,$headers);
?> 
0
задан Jaime Menendez Llana 6 April 2016 в 07:54
поделиться

2 ответа

Преобразуйте цветовые модели ORANGE_MIN, ORANGE_MAX и color в HSL (HSV) и убедитесь, что оттенок находится в пределах требуемого диапазона. См., Например, http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/ для математики.

UPDATE

Насыщенность и легкость также следует проверять на некоторых диапазонах, см. комментарии ниже. Спасибо MSalters за указание этого.

0
ответ дан Daniel Langr 21 August 2018 в 15:56
поделиться
  • 1
    За исключением того, что вы должны проверить другие 2 переменные, чтобы увидеть, имеете ли вы дело с белым, серым или черным. – MSalters 6 April 2016 в 08:36
  • 2
    Вы правы, забудьте об этом. Вероятность проверки легкости и насыщенности на некоторых допустимых диапазонах. – Daniel Langr 6 April 2016 в 08:58
  • 3
    Я не знаю, почему вычисляется значение насыщения, если оно не используется. В чем важность этого? – Jaime Menendez Llana 6 April 2016 в 10:23
  • 4
    Насыщенность эффективно означает, сколько оттенков применяется в заданном цвете. Насыщенность 0 превращает цвета в оттенки серого, независимо от их оттенка. Аналогично, яркость 0 и 1 приводит к черно-белому цвету, соответственно, снова независимо от оттенка. Вот почему вы, вероятно, хотите ограничить насыщенность и легкость в некоторых диапазонах (например, насыщенность от 0,25 до 1 и легкость от 0,25 до 0,75); определенные значения зависят от вашей проблемы. – Daniel Langr 6 April 2016 в 12:00

Я пойду несколько иначе. Вместо определения интервалов диапазона для всех предопределенных цветов вы можете:

  1. Определить свои предопределенные цвета . Это будет палитра ваших возможных цветов
  2. . Учитывая цвет, который вы хотите проверить, вычислите расстояние от всех цветов в вашей палитре и сохраните ближайшую палитру / g3].
  3. Проверьте, достаточно ли найденного палитра .

В этом маленьком образце я использовал цветовое пространство BGR, так как хорошо ведется эвклидовое расстояние (norm двух цветов).

Вы можете использовать другое цветовое пространство, например, HSV, но вам нужно найти подходящее расстояние. Вы не можете использовать только значение H, поскольку вы будете пропускать черные / белые / серые цвета (как указано в @MSalters).

Итак, например, ваш цвет почти оранжевый 20, 130, 250, с соответствующей палитрой вы получите что-то вроде:

[20, 130, 250] is similar to orange
Distance with nearest color [0, 127, 255] is 20.8327

Код:

#include <opencv2/opencv.hpp>
#include <vector>
#include <map>
#include <string>
using namespace cv;
using namespace std;

// Needed to put Vec3b into a std::map
struct lessVec3b
{
    bool operator()(const Vec3b& lhs, const Vec3b& rhs) {
        return (lhs[0] != rhs[0]) ? (lhs[0] < rhs[0]) : ((lhs[1] != rhs[1]) ? (lhs[1] < rhs[1]) : (lhs[2] < rhs[2]));
    }
};


int main()
{
    // Define a set of predefined BGR colors
    map<Vec3b, string, lessVec3b> palette;
    palette[Vec3b(0, 0, 0)] = "black";
    palette[Vec3b(0, 0, 255)] = "red";
    palette[Vec3b(0, 255, 0)] = "green";
    palette[Vec3b(255, 0, 0)] = "blue";
    palette[Vec3b(0, 127, 255)] = "orange";

    // Your color
    Vec3b my_color(20, 130, 250); // almost orange

    // Look for nearest color in palette
    Vec3b nearest_color;
    string color_name;
    float min_distance = FLT_MAX;
    for (const auto& pal : palette)
    {
        float dist = norm(pal.first, my_color);
        if (dist < min_distance)
        {
            nearest_color = pal.first;
            color_name = pal.second;
            min_distance = dist;
        }
    }

    // Define a distance. This will behave like your ranges
    float th_distance = 1000.f;

    if (min_distance < th_distance)
    {
        cout << my_color << " is similar to " << color_name <<  endl;
    }
    else
    {
        cout << my_color << " is not in the palette" << endl;
    }
    cout << "Distance with nearest color " << nearest_color << " is " << min_distance << endl;

    return 0;
}
1
ответ дан Miki 21 August 2018 в 15:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: