2014-01-16 4 views
0

Я начал изучать обработку изображений на RI, чтобы изменить яркость изображений, чтобы сделать все изображения одинаково яркими. Кто-нибудь может помочь мне, предложив какой-то способ достичь этого. Можно извлечь компонент RGB изображения Помогите мне в решении выше задачи? ThankyouОбработка изображений In R

+1

Пожалуйста, помогите нам помочь вам, предоставив нам воспроизводимый пример (т. код и данные примера), см. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example для деталей. –

ответ

3

Согласитесь с предыдущим ответом, но стоит отметить, что пакет, такой как png, может предоставить вам необработанные данные вашего изображения в R, которые затем можно манипулировать векторной математикой или применять функции обычным способом.

Вот простой пример перекоса яркости (субъективного термина!) Сегодняшнего Google Doodle, сдвинув всю карту, но вы будете изобретать ОЧЕНЬ большое колесо, если вы хотите сделать что-то немного сложное (или с предсказуемые результаты!)

require(png) 

img<-readPNG(source="gdood.png") 

enter image description here

writePNG(img^0.5,target="bright.png") 

enter image description here

writePNG(img^2,target="dark.png") 

enter image description here

и код, чтобы сделать его 50% (или x%) ярче (субъективно!)

writePNG(img+(1-img)*0.5,target="50percent.png") 

enter image description here

или "в два раза" яркий

writePNG(ifelse(img*2>1,1,img*2),target="twiceas.png") 

enter image description here

, очевидно, вы можете также изменить/доступ только R/G/B, глядя на каждой матрице срез (1-R, 2-G, 3-B)

поэтому для смещения красных вверх:

imgr<-img 
imgr[,,1]<-img[,,1]+(1-img[,,1])*0.5 
writePNG(imgr,target="redshift.png") 

enter image description here

РАСЧЕТ ОТНОСИТЕЛЬНОЙ яркостной ИЗОБРАЖЕНИЙ

В соответствии с просьбой, вот пример с парой подобных изображений, загруженных из Интернета:

# get the images  
a.1<-readPNG(source="apple1-orig.png") 
a.2<-readPNG(source="apple2-orig.png") 

enter image description here enter image description here

ПРИМЕЧАНИЕ. Я упростил некоторые вещи, используя изображение (каракули) ранее в примере, который НЕ ПРОЗРАЧЕН. Для полноты я должен был объяснить, что функция readPNG() возвращает объект RGBA, четыре матрицы для красного, зеленого, синего и альфа (прозрачности). Если Alpha = 1 по матрице, приведенные выше примеры работают нормально, но настройка альфа не работает так же, как яркость, поэтому, если у вас нет согласованной альфы, вы можете получить нечетные результаты. Здесь (внизу) изображены снимки с прозрачностью - вы можете видеть, что они выглядят неожиданно разными.

# change the alpha (channel 4) to 1 (no transparency)  
a.1[,,4]<-a.1[,,4]+(1-a.1[,,4]) 
a.2[,,4]<-a.2[,,4]+(1-a.2[,,4]) 

writePNG(a.1,target="apple1.png") 
writePNG(a.2,target="apple2.png") 

enter image description here enter image description here

Теперь мы хотим, чтобы настроить яркость, и, очевидно, мы должны определить его. Здесь я использую простейшее определение (R + B + G)/3. Существует ряд определений; довольно хорошая статья здесь: http://www.kweii.com/site/color_theory/2007_LV/BrightnessCalculation.pdf

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

# work out the brightness (~sum(R,G,B)/3) 
a.1.b<-sum(a.1[,,1:3])  # RGB brightness value a.1 
a.1.max<-length(a.1[,,1:3]) # max brightness value a.1 
b.1<-a.1.b/a.1.max     # brightness ratio 

a.2.b<-sum(a.2[,,1:3])  # RGB brightness value a.2 
a.2.max<-length(a.2[,,1:3]) # max brightness value a.2 
b.2<-a.2.b/a.2.max     # brightness ratio 

paste("a1 brightness:",b.1,"a2 brightness:",b.2) 
# here's the results 
[1] "a1 brightness: 0.151682883986928 a2 brightness: 0.483427459150327" 

#make a copy of a1 
a.1.new<-a.1 

#work out how much brighter to make it 
incr<-1-((1-b.2)/(1-b.1)) # % increase 

# then brighten it 
a.1.new[,,1:3]<-a.1[,,1:3]+(1-a.1[,,1:3])*incr 

# check equivalence between a2 and a1.new (rounding to avoid calc errors) 
round(sum(a.2),0)==round(sum(a.1.new),0) 
[1] TRUE 

writePNG(a.1.new,target="apple1-new.png") 

enter image description here

сравнить с оригиналы:

enter image description here enter image description here

+0

Спасибо за объяснение, но чтобы сделать два изображения одинаково ярче, сначала мне нужно сравнить яркость двух изображений, а затем на основе разности я должен выполнить векторную операцию. Могу ли я найти разницу яркости между двумя изображениями, сначала добавив rgb значения двух изображений отдельно, а затем их сравнение? – zzzz

+0

да - настроюсь, чтобы дать несколько простых примеров – Troy

+0

Это действительно помогло мне .. Танку :) – zzzz

2

Оставляя в стороне тот факт, что «яркость» может иметь несколько субъективных переводов, я настоятельно рекомендую не изобретать колесо. В зависимости от вашей платформы и вашего бюджета такие инструменты, как GraphicConverter, GIMP, Photoshop, ImageJ и т. Д., Специально разработаны для обработки изображений и будут выполнять вашу работу гораздо эффективнее, чем переписывать алгоритмы в R.

Но, честно говоря, прежде чем вы начнете заниматься цифровой обработкой, вам нужно потратить время, чтобы узнать разницу между «яркостью», «насыщенностью», «цветностью» и другими значениями цветовосприятия.

Смежные вопросы