Как сопоставить значения интенсивности цвета с его именем?

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

. Подобные примеры также можно найти в JLS 3.10.5-1 .

1
задан Alderven 25 February 2019 в 15:03
поделиться

1 ответ

Вы можете использовать PIL вместе с веб-цветами для получения статистики цвета изображения:

import webcolors
from PIL import Image
from collections import Counter

def get_colour_name(requested_colour):
    try:
        return webcolors.rgb_to_name(requested_colour)
    except ValueError:
        min_colours = {}
        for key, name_ in webcolors.css3_hex_to_names.items():
            r_c, g_c, b_c = webcolors.hex_to_rgb(key)
            rd = (r_c - requested_colour[0]) ** 2
            gd = (g_c - requested_colour[1]) ** 2
            bd = (b_c - requested_colour[2]) ** 2
            min_colours[(rd + gd + bd)] = name_
        return min_colours[min(min_colours.keys())]

image = Image.open('image.jpg')
pixels = image.load()
w, h = image.size
colors = []
for x in range(w):
    for y in range(h):
        colors.append(get_colour_name(pixels[x, y]))

for i, c in enumerate(Counter(colors).most_common(5)):
    print('{}. {:15} {:>2.1f}%'.format(i+1, c[0], c[1] * 100 / len(colors)))

Например, для следующего изображения:

enter image description here

5 самых распространенных цветов:

1. crimson         10.3%
2. maroon          9.8%
3. darkslategrey   9.2%
4. dimgrey         8.4%
5. grey            8.1%
0
ответ дан Alderven 25 February 2019 в 15:03
поделиться
Другие вопросы по тегам:

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