Обнаружение полутоновых изображений с .NET

Я иногда использую макросы, таким образом, я могу определить информацию в одном месте, но использовать их по-разному в различных частях кода. Это является незначительно злым:)

, Например, в "field_list.h":

/*
 * List of fields, names and values.
 */
FIELD(EXAMPLE1, "first example", 10)
FIELD(EXAMPLE2, "second example", 96)
FIELD(ANOTHER, "more stuff", 32)
...
#undef FIELD

Тогда для общедоступного перечисления это может быть определено, чтобы просто использовать имя:

#define FIELD(name, desc, value) FIELD_ ## name,

typedef field_ {

#include "field_list.h"

    FIELD_MAX

} field_en;

И в частной функции init, все поля могут использоваться для заполнения таблицы с данными:

#define FIELD(name, desc, value) \
    table[FIELD_ ## name].desc = desc; \
    table[FIELD_ ## name].value = value;

#include "field_list.h"
10
задан Chris W. Rea 9 December 2009 в 22:50
поделиться

3 ответа

Простой алгоритм проверки цвета: пройдитесь по изображению пиксель за пикселем во вложенном цикле for (ширина и высота) и проверьте, равны ли значения RGB пикселей. Если это не так, то изображение содержит информацию о цвете. Если вы пройдете через все пиксели, не столкнувшись с этим условием, то вы получите изображение в градациях серого.

Редакция с более сложным алгоритмом:

В первой редакции этого поста я предложил простой алгоритм, который предполагает, что пиксели имеют шкалу серого, если значения RGB каждого пикселя равны. Таким образом, RGB 0,0,0 или 128,128,128 или 230,230,230 будут все тестироваться как серые, а 123,90,78 - нет. Просто.

Вот фрагмент кода, который проверяет отклонение от серого. Эти два метода представляют собой небольшую часть более сложного процесса, но они должны предоставлять достаточно сырого кода, чтобы помочь с исходным вопросом.

/// <summary>
/// This function accepts a bitmap and then performs a delta
/// comparison on all the pixels to find the highest delta
/// color in the image. This calculation only works for images
/// which have a field of similar color and some grayscale or
/// near-grayscale outlines. The result ought to be that the
/// calculated color is a sample of the "field". From this we
/// can infer which color in the image actualy represents a
/// contiguous field in which we're interested.
/// See the documentation of GetRgbDelta for more information.
/// </summary>
/// <param name="bmp">A bitmap for sampling</param>
/// <returns>The highest delta color</returns>
public static Color CalculateColorKey(Bitmap bmp)
{
    Color keyColor = Color.Empty;
    int highestRgbDelta = 0;

    for (int x = 0; x < bmp.Width; x++)
    {
        for (int y = 0; y < bmp.Height; y++)
        {
            if (GetRgbDelta(bmp.GetPixel(x, y)) <= highestRgbDelta) continue;

            highestRgbDelta = GetRgbDelta(bmp.GetPixel(x, y));
            keyColor = bmp.GetPixel(x, y);
        }
    }

    return keyColor;
}

/// <summary>
/// Utility method that encapsulates the RGB Delta calculation:
/// delta = abs(R-G) + abs(G-B) + abs(B-R) 
/// So, between the color RGB(50,100,50) and RGB(128,128,128)
/// The first would be the higher delta with a value of 100 as compared
/// to the secong color which, being grayscale, would have a delta of 0
/// </summary>
/// <param name="color">The color for which to calculate the delta</param>
/// <returns>An integer in the range 0 to 510 indicating the difference
/// in the RGB values that comprise the color</returns>
private static int GetRgbDelta(Color color)
{
    return
        Math.Abs(color.R - color.G) +
        Math.Abs(color.G - color.B) +
        Math.Abs(color.B - color.R);
}
6
ответ дан 3 December 2019 в 18:33
поделиться

Если вы не можете найти библиотеку для этого, вы можете попробовать захватить большое количество (или все) пикселей для изображения и посмотреть, находятся ли их значения r, g и b в пределах определенного порога (который вы можете установить эмпирически или установить в качестве настройки) друг друга. Если это так, изображение будет в оттенках серого.

Я бы определенно сделал порог для теста немного больше 0, хотя ... поэтому я бы не стал тестировать, например, r = g, но (abs (rg) точно оттенков серого.

вы можете попробовать захватить большое количество (или все) пикселей для изображения и посмотреть, находятся ли их значения r, g и b в пределах определенного порога (который вы можете установить эмпирически или установить в качестве настройки) друг друга. Если это так, изображение будет в оттенках серого.

Я бы определенно сделал порог для теста немного больше 0, хотя ... поэтому я бы не стал тестировать, например, r = g, но (abs (rg) точно оттенков серого.

вы можете попробовать захватить большое количество (или все) пикселей для изображения и посмотреть, находятся ли их значения r, g и b в пределах определенного порогового значения (которое вы можете установить эмпирически или установить как настройку) друг друга. Если это так, изображение будет в оттенках серого.

Я бы определенно сделал порог для теста немного больше 0, хотя ... поэтому я бы не стал тестировать, например, r = g, но (abs (rg) точно оттенков серого.

Я бы определенно сделал порог для теста немного больше 0, хотя ... поэтому я бы не стал тестировать, например, r = g, но (abs (rg) точно оттенков серого.

Я бы определенно сделал порог для теста немного больше 0, хотя ... поэтому я бы не стал тестировать, например, r = g, но (abs (rg) точно оттенков серого.

14
ответ дан 3 December 2019 в 18:33
поделиться

Так как JPEG поддерживает метаданные, сначала вам следует проверить, помещает ли ваше программное обеспечение сканера какие-либо особые данные в сохраненные изображения и можете ли вы полагаться на эту информацию.

0
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

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