1

Тема: Як виділити найбільш вживані, але різні кольори на картинці?

Добрий вечір, я диспетчер.

ну я

https://upload.wikimedia.org/wikipedia/uk/c/c8/Windows_10_Task_Manager.png

Уявіть собі, шо ви бачите хмаринку, і вона складається хоч і з різних кольорів, але подібних. Вона має тіні та підсвічування, є якісь геть темні кольори, але їх може бути небагато, а інших, сірих, може бути багато.

Як можна виділити декілька кольорів, з яких потім можна намалювати цю саму хмаринку, але не такою деталізованою за рахунок меншої кількості кольорів?

Поки що мій алгоритм такий:

1. порахувати кількість пікселів кожного кольору
2. обрати 5 (для прикладу) найбільш вживаних кольорів
3. пройтись по всім пікселям і порахувати, до якого з тих п'яти кольорів цей піксель найбільш подібний, і замінити його цим кольором

Алгоритм порівняння кольорів дуже простий, це просто довжина вектору, що складається зі значення червоного, зеленого і синього кольорів пікселя.

Ось код на рубі

require 'rmagick'
include Magick

def color_length(color)
  Math.sqrt(
    color.red**2 +
    color.green**2 +
    color.blue**2
  )
end

image = Image.read('./makoto_cloud123.png').first
colors = Hash.new(0)

image.each_pixel do |pixel, _c, _r|
  next if pixel.alpha < 65_535

  name = pixel.to_s
  if colors.key? name
    colors[name][:count] += 1
  else
    colors[name] = { count: 1, length: color_length(pixel), pixel: pixel }
  end
end

top_5 = colors.sort_by { |_key, value| -value.count }.first 5

top_5_hash = top_5.to_h

puts(colors.max_by { |_color, info| info[:pixel].alpha })

colors.delete_if { |key, _value| top_5_hash.key? key }

image.each_pixel do |pixel, c, r|
  next if pixel.alpha < 65_535

  name = pixel.to_s
  next unless colors.key? name

  closest_color = top_5_hash.min_by { |_color, info| (info[:length] - colors[name][:length]).abs }
  image.pixel_color(c, r, closest_color[1][:pixel])
end

# Save the modified image
image.write('./makoto_simple.png')

але воно шось не виходе.

На вхід даю таку картинку

Прихований текст

https://i.imgur.com/fS8B2UK.png

а на виході отаке

Прихований текст

https://i.imgur.com/RfQMztR.png

2

Re: Як виділити найбільш вживані, але різні кольори на картинці?

окей, воно так виглядає, шо порівняння кольорів таким чином - це повна маячня,бо не беруться до уваги пропорції складників кольору. Це клятий чатгпт мене надурив, він з впевненістю сказав, шо це норм порівняння, але ж це не так!!!

А як тоді можна порівняти кольори?

3

Re: Як виділити найбільш вживані, але різні кольори на картинці?

FakiNyan написав:

окей, воно так виглядає, шо порівняння кольорів таким чином - це повна маячня,бо не беруться до уваги пропорції складників кольору. Це клятий чатгпт мене надурив, він з впевненістю сказав, шо це норм порівняння, але ж це не так!!!

А як тоді можна порівняти кольори?

Color difference?
Ну і CCC та Color quantization, щодо алгоритмів компресії.

Прихований текст
FakiNyan написав:

Це клятий чатгпт мене надурив, він з впевненістю сказав, шо це норм порівняння, але ж це не так!!!

:D :D :D

Подякували: leofun011

4 Востаннє редагувалося frz (04.03.2024 23:47:04)

Re: Як виділити найбільш вживані, але різні кольори на картинці?

чатгпт надурив
FakiNyan написав:

чатгпт мене надурив

Воно запрограмоване чітко відмовляти у відповіді на заборонені запитання, однак на все решта воно відповідає хоч щось, і це вже відповідальність користувача перевіряти правильність відповіді самостійно. При цьому рівень булшиту в питаннях програмування дещо нижчий в чатів, які заточені саме на цю тему, наприклад Github Copilot (сам користуюся і можу впевнено порадити), хоча і там таке теж буває.

FakiNyan написав:

він з впевненістю сказав

Ну не він а воно, а щодо впевненості - то в нього поки що інтонації немає.

Upd: І воно мені ще ніколи не сказало "сорі, я хоч можу відповідати на кодерські питання, однак саме в цьому нюансі я не шарю".

5

Re: Як виділити найбільш вживані, але різні кольори на картинці?

офтоп
FakiNyan написав:

Це клятий чатгпт мене надурив, він з впевненістю сказав, шо це норм порівняння, але ж це не так

Десь на форумі мовних моделей ChatGPT скаржиться :
- Це клятий FakiNyan мене надурив, він з впевненістю сказав, шо хоче одне, а він хотів інше..
*JOKINGLY*

6

Re: Як виділити найбільш вживані, але різні кольори на картинці?

Вам, схоже, кластерний аналіз потрібен.
По кластерах берете середні і міняєте на них.

Подякували: FakiNyan1

7

Re: Як виділити найбільш вживані, але різні кольори на картинці?

Виходе, що та бібліотека має функцію quantize, яка робе те, шо треба, осьо результат. https://replace.org.ua/uploads/images/2564/1b663a319431f68682a0c2cdb83639d8.png

Подякували: koala, PRY2