2017-07-28 1 views
0

Je souhaite corriger ma luminosité inégale/luminosité de toutes mes images (dans l'espoir d'obtenir toute la luminosité). Après avoir obtenu la différence de canal de luminosité pour mes images en boucle à mes images de référence. J'ajoute la différence et la sauvegarde sur de nouvelles images ... cependant, après avoir vérifié les nouvelles images, j'ai réalisé que j'avais encore une luminosité inégale ... Y at-il quelque chose qui ne va pas avec mon code? Toute aide ou correction est appréciée. J'ai essayé ce code sur les espaces de couleurs LAB et HSV, toujours les mêmes. Voici le code et quelques résultats que j'ai obtenus.OpenCV_Python: Lightness Channel Manipulation, Essayer d'obtenir la même luminosité pour toutes les images

from PIL import Image 
import numpy as np 
import cv2 


path = 'R:\\Temp\\zzzz\\AlignedPhoto_in_PNG\\' 
path1 = 'R:\\Temp\\zzzz\\Testing1\\' 


img = cv2.imread(path + 'aligned_IMG_1770.png') 
img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) 
a = np.mean(img[:,:,0]) 

for i in range (1770,1869): 
    img1 = cv2.imread(path + 'aligned_IMG_%d.png'%(i)) 
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2LAB) 
    img1[:,:,0], img1[:,:,1], img1[:,:,2] = cv2.split(img1) 
    print(img1[:,:,0]) 
    b = np.mean(img1[:,:,0]) 
    diff= b-a 
    print(diff) 
    img1[:,:,0] = img1[:,:,0] + diff 
    img1 = cv2.merge([img1[:,:,0], img1[:,:,1], img1[:,:,2]]) 
    print(img1[:,:,0]) 
    img1 = cv2.cvtColor(img1, cv2.COLOR_LAB2BGR) 
    cv2.imwrite(path1 + 'Testing1_%d.png'%(i), img1) 

En outre, aucune indication sur la façon dont je peux modifier le code existant pour vous assurer après avoir ajouté la différence, la nouvelle valeur ne dépasse pas la plage max/min de Légèreté Channel LAB ou la plage max/min de Chaîne de valeur dans HSV? Je ai réalisé après l'addition si la nouvelle valeur est> 255, la valeur de commencer à compter à partir de 1. Je ai cherché sur comment résoudre ce problème ou définir la gamme, mais je ne sais pas comment le faire

Voici quelques images résultat que j'ai eu du code ci-dessus. J'espère que cela aidera à identifier ce qui n'a pas fonctionné avec mon code car je reçois encore une luminosité inégale pour les nouvelles images après avoir ajouté la différence.

[[ 39 39 39 ..., 38 38 36] 
[ 39 38 39 ..., 39 39 39] 
[ 40 40 40 ..., 39 39 39] 
..., 
[119 119 122 ..., 165 166 167] 
[118 118 120 ..., 169 166 166] 
[115 116 117 ..., 175 169 167]] 
0.0 
[[ 39 39 39 ..., 38 38 36] 
[ 39 38 39 ..., 39 39 39] 
[ 40 40 40 ..., 39 39 39] 
..., 
[119 119 122 ..., 165 166 167] 
[118 118 120 ..., 169 166 166] 
[115 116 117 ..., 175 169 167]] 
[[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
..., 
[117 119 119 ..., 165 163 131] 
[117 117 118 ..., 170 166 131] 
[115 116 116 ..., 176 171 134]] 
-1.48181156101 
[[255 255 255 ..., 255 255 255] 
[255 255 255 ..., 255 255 255] 
[255 255 255 ..., 255 255 255] 
..., 
[115 117 117 ..., 163 161 129] 
[115 115 116 ..., 168 164 129] 
[113 114 114 ..., 174 169 132]] 
[[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
..., 
[ 0 97 115 ..., 165 164 165] 
[ 0 96 114 ..., 169 166 164] 
[ 0 95 113 ..., 175 170 166]] 
-3.69765536832 
[[253 253 253 ..., 253 253 253] 
[253 253 253 ..., 253 253 253] 
[253 253 253 ..., 253 253 253] 
..., 
[253 93 111 ..., 161 160 161] 
[253 92 110 ..., 165 162 160] 
[253 91 109 ..., 171 166 162]] 
+0

ne pense pas trop compliqué. si vous calculez un décalage et que vous obtenez des résultats erronés. la première chose à faire est de vérifier votre calcul de décalage en utilisant un exemple. ou simplement penser ce qui se passerait si un est plus lumineux que b .... ne fais pas penser à d 'autres personnes – Piglet

+0

@Piglet le diff sera diff = a - b même si je prends ma première luminosité d' images qui est une as ma valeur de luminosité de référence? – SacreD

+0

@Piglet je ne comprends toujours pas comment régler le plafond pour pixel à l'intérieur de la gamme de canaux .... vraiment tout exemple est vraiment utile pour moi dans la compréhension et l'apprentissage. J'ai appris le plus par l'exemple/pratique comme parfois je ne comprends pas quand je lis la documentation ou la théorie – SacreD

Répondre

1

C'est pourquoi les mathématiques sont une compétence que tout programmeur devrait posséder.

Vous corrigez votre luminosité en ajoutant diff.

Donc, si vous voulez un à égal à la somme de b et diff

a = b + diff 

et vous savez un et être. alors comment obtenez-vous diff?

diff = a - b 

pas

diff = b - a 

Sinon, vous faire des images plus sombres plus sombres et des images plus lumineuses plus lumineux au lieu de les amener à votre moyenne de référence d'un ...

Bien sûr, utiliser un décalage global provoquera problèmes avec les pixels qui dépassent votre plage de valeurs. Vous devez contourner ce problème. Sinon, votre nouveau moyen aura tort.

+0

le diff sera diff = a - b même si je prends ma première luminosité d'image qui est une valeur de luminosité de référence? – SacreD

+1

@SacreD Je ne comprends pas ce que vous voulez dire. dans votre image de code a est votre référence. L'image b change pour chaque image de votre boucle. Si l'image b est plus claire que l'on a besoin de réduire sa luminosité pour obtenir la même luminosité qu'en b, votre décalage doit être négatif. si vous le faites à votre façon, votre offset est positif et vous obtenez une image encore plus lumineuse ... – Piglet