Каже се да слика вреди хиљаду речи. И на много начина речи на сликама су боје. Боје су саставни део нашег живота и не можемо порећи њихову важност.
Док смо гледали слику, често смо покушавали да препознамо боју на њеном делу. Сви смо то покушали, али никада нисмо детаљно. Када нас питају да идентификујемо боје са слике, обично их означавамо помоћу одређених назива боја, као што су црвена, плава и зелена. Међутим, ако се од нас затражи да на слици издвојимо 30 најистакнутијих боја, наше око их не може тако лако открити или идентификовати. Цамалиан је све ово. Помаже вам да из слика извучете боје, а затим се поиграте њима.
У овом чланку ћемо завирити у то који су то простори боја, шта Руби гем Цамалиан нуди и како се од њега може направити једноставан претраживач слика који помоћу боја препознаје и разликује их.
Пре него што започнемо, прво да разумемо неке основне концепте о бојама. Слике представљене на нашим екранима представљене су помоћу дводимензионалног низа пиксела. Иако се сликовне датотеке могу кодирати на различите начине, сирови приказ након декомпресије и декодирања података је исти. У овом представљању заснованом на 2д низу, сваки пиксел на слици у боји има три компоненте: црвену, зелену и плаву. Иако су слике одштампане на папиру такође дводимензионална површина тачака, саме тачке су обично мешавина четири компонентне боје: цијан, магента, жута и црна. Ове се, међу неким другим различитим техникама које се користе за представљање боја, називају просторима боја. Неки од најпопуларнијих простора боја су РГБ, ЦМИК, ХСЛ и ХСВ. ЦМИК се углавном користи у штампарској индустрији, док се сви остали користе у дигиталним медијима.
Било који физички електронски медиј попут ЦРТ екрана, ЛЦД-а или телефона који преносе светлост производе боју помоћу три компоненте: црвене, зелене, плаве. Људско око може открити милионе боја стимулисањем три врсте рецептора за боје у оку. Те рецепторе можете повезати са Р, Г и Б.
У идеалном случају, свака компонента боје чува се у бајту чије се вредности могу кретати између 0 и 255.
Уређивање простора РГБ боја на коцки прилично је изазовно. Резултати покушаја да се то прикаже на коцки или у точкићу у боји су лоши. Док радите са милионима или бојама, свака нијанса боје не може се правилно поравнати на РГБ простору боја.
подешавање перформанси у скл серверу 2008 корак по корак
Да би превазишли овај проблем, истраживачи су 1970-их увели просторе боја ХСВ (нијанса, засићеност, вредност) и ХСЛ (нијанса, засићеност, светлост). Оба ова простора боја могу се правилно поравнати на колу за боје и олакшати препознавање различитих нијанси боја на њему.
Цамалиан је све око боја. Једна од најједноставнијих ствари које можете учинити са Цамалиан-ом је идентификација сваке нијансе боје која се користи на слици.
Рецимо да имамо слику са 15 различитих боја.
Идентификовање боја из узорка је сигурно лакше него њихово препознавање на самој слици. Штавише, ово је једноставна слика, а стварне фотографије су често много разноврсније када је у питању њихова палета боја. Издвајање вредности боја са слике захтева неке прилично незгодне комадиће кода и ту Цамалиан улази. Ради те незгодне ствари за вас тако да са лакоћом можете да извучете информације у вези са бојом.
Ако је извлачење боја помоћу Цамалиан-а једноставно, његово инсталирање је још лакше. Можете инсталирати Руби драгуљ извршавањем:
gem install camalian
А да бисте користили овај драгуљ, можете га захтевати директно у своју Руби скрипту:
require 'camalian'
Да бисмо извукли боје са слике, прво је морамо учитати у меморију и користити методе на објекту слике:
шта можете да урадите са ноде.јс
image = Camalian::load( File.join( File.dirname(__FILE__), 'colormap.png') ) colors = image.prominent_colors(15) puts colors.map(&:to_hex)
Овај исечак кода учитава слику под називом „цолормап.пнг“ из директоријума у коме се налази скрипта и из ње издваја 15 најистакнутијих боја.
Да бисте га покренули, сачувајте датотеку као „цолор_тест1.рб“ и покрените је у љусци до ruby color_test1.rb
. Требало би да произведе излаз сличан следећем:
['#318578', '#41b53f', '#2560a3', '#359169', '#2154b1', '#4dda15', '#1d48bf', '#1530dc', '#296d94', '#193dcd', '#3da94d', '#45c131', '#3da84e', '#2d7986', '#193cce']
И то је тако лако! Управо смо издвојили 15 боја коришћених на горњој слици. Можете ли да замислите да то покушате да користите помоћу петљивог кода или још горе, својим очима? Подесимо ствари за тренутак. Овог пута ћемо покушати да користимо Цамалиан на слици са више детаља:
Покретањем исте скрипте на овој слици добијамо следеће:
[“#210b03”, “#723209”, “#974d09”, “#ae5d08”, “#c77414”, “#d77f15”, “#ffea54”, “#94651f”, “#b66a15”, “#c25f06”, “#fdd94d”, “#d39a39”, “#efa540”, “#fffffe”, “#fff655”]
Покушај визуелизације низа вредности боја произведених горе даје нам отприлике следеће:
Палета је добра, али у издвојеним бојама нема специфичног узорка. Хајде да сортирамо вредности боја по сличности и видимо да ли то помаже. Све што треба да урадимо је да позовемо још једну функцију пре него што уствари одштампамо низ на конзолу:
colors = image.prominent_colors(15).sort_similar_colors
Ноде јс у односу на перформансе питхон-а
Али шта ако бисмо желели да издвојимо боје које су релативно светлије? Можда желимо да боје које су само 40% тамне или, другим речима, имају вредност светлости (у ХСЛ простору боја) између 0 и 40. Све што треба да урадимо је:
colors = image.prominent_colors(15).light_colors(0, 40)
Сада када знамо како је лако бавити се бојама помоћу Цамалиан-а, направимо једноставну веб апликацију која вам омогућава да отпремате слике и индексујете их по бојама. Ради краткоће прескочићемо разне појединости о којима је реч градећи Руби апликација. Уместо тога, фокусираћемо се на детаље који се баве бојама и употребом Камалија.
Што се тиче домета ове Руби апликације, ми ћемо је ограничити на руковање отпремањем слика, издвајањем боја са слике пре него што их сачувамо и тражењем отпремљене слике на основу одабране боје и прага.
Испод је дијаграм модела који објашњава структуру наше апликације:
нагласак на принципима дизајна
Свака отпремљена слика представљена је помоћу објекта ПортфолиоИтем. Сваки објекат у боји представља јединствене боје откривене помоћу отпремљених слика, и на крају ПортфолиоЦолор представља однос између сваке слике и боја које се у њој налазе.
Већина битова апликације је прилично стандардна, посебно када је реч о руковању отпремањем слика, креирању ентитета модела и њиховом упорном раду у бази података итд. Руби програмер , то би требало бити мало паметно. Испод је метода која се користи за издвајање боје из отпремљене слике:
after_save :extract_colors private def extract_colors image = Camalian::load(self.image.path) colors = image.prominent_colors(self.color_count.to_i).sort_similar_colors colors.each do |color| unless c = Color.where(r: color.r, g: color.g, b: color.b).first c = Color.create(r: color.r, g: color.g, b: color.b, h: color.h, s: color.s, l: color.l) end self.colors << c end end
Ово помаже издвајањем палете боја и чувањем у бази података. Приметите како издвајамо само одређени број истакнутих боја (нешто што корисник може дефинисати приликом отпремања слике).
Када корисник пошаље слику путем обрасца на веб корисничком интерфејсу, слика се прима преко обрађивача постова и нова ПортфолиоИтем је створена за то. Ова метода, екстракт_боје , позива се сваки пут када се ставка портфолија настави у бази података.
Да бисмо могли да прикажемо палету боја на страницама, користимо једноставног помоћника:
module PortfolioItemsHelper def print_color_palette(colors) color_string = '' colors.each do |c| color_string += content_tag :span, ' ', style: 'display: block; float: left; width: 35px; height: 35px; background: #{c.to_hex}' end content_tag :div, color_string.html_safe, style: 'display: inline-block;' end end
У суштини ствара а див са малим квадратом обухвата , свака чија је боја позадине подешена на једну од издвојених истакнутих боја.
Коначно, да бисмо применили претрагу, морамо користити мало математике и логике:
class PortfolioSearchForm include ActiveModel::Model attr_accessor :color, :similarity validates_presence_of :color, :similarity def color_object @color_object ||= Camalian::Color.new(self.color) end def color_range(color, level) (color_object.send(color) - level)..(color_object.send(color) + level) end def colors_by_rgb level = self.similarity.to_i * 255 / 100.0 Color.where(r: color_range(:r, level), g: color_range(:g, level), b: color_range(:b, level)) end def colors_by_hsl level = self.similarity.to_i Color.where(h: color_range(:h, (self.similarity.to_i * 30 / 100.0) ), s: color_range(:s, level), l: color_range(:l, level)) end end
Са цолорс_би_хсл методу, можемо да дохватимо све Боја ентитети који се подударају са нашим упитом. А помоћу њих можемо идентификовати све отпремљене слике и приказати нашу страницу резултата претраживања. Сам упит је прилично једноставан. С обзиром на одређену боју и вредност сличности, опсег вредности израчунава се за сваку компоненту боје.
руби он раилс рест апи туториал
И то су углавном сви најтежи делови.
Комплетни код можете пронаћи на ГитХуб . Можете инсталирати инстанцу ове апликације на Хероку или је испробати локално:
git clone https://github.com/nazarhussain/camalian-sample-app.git cd camalian-sample-app bundle install rake db:migrate rails s
Коначна пријава изгледа отприлике овако:
Када се апликација покрене, усмерите веб прегледач на хттп: // лоцалхост: 3000. Користите образац на екрану, отпремите неколико слика различитих палета боја. Затим, за претрагу слика по боји, користите поље за претрагу у горњем десном углу. Падајући праг вам омогућава да одредите толеранцију несличности за подударање боја слика.
Демо апликација коју смо изградили у овом чланку прилично је једноставна, али могућности је безброј! Неке друге практичне употребе ове библиотеке могу да укључују:
Можете даље истраживати библиотеку на ГитХуб и проверите његов изворни код. Слободно пријављујте грешке стварањем проблема или доприносите слањем захтева за повлачењем.