2017-09-24 8 views
-1

で自動ホワイトバランス:私はそれらを実装するためのpythonとOpenCVのを使用している https://pippin.gimp.org/image-processing/chapter-automaticadjustments.html私はによって提供さホワイトバランスアルゴリズムを実装しようとしているGrayworld仮定

。私はウェブサイトと同じ結果を出すことができません。私はつもりですどこ

import cv2 as cv 
import numpy as np 

def show(final): 
    print 'display' 
    cv.imshow("Temple", final) 
    cv.waitKey(0) 
    cv.destroyAllWindows() 

def saveimg(final): 
    print 'saving' 
    cv.imwrite("result.jpg", final) 

# Insert any filename with path 
img = cv.imread("grayworld_assumption_0.png") 
res = img 
final = cv.cvtColor(res, cv.COLOR_BGR2LAB) 

avg_a = -np.average(final[:,:,1]) 
avg_b = -np.average(final[:,:,2]) 

for x in range(final.shape[0]): 
    for y in range(final.shape[1]): 
     l,a,b = final[x][y] 
     shift_a = avg_a * (l/100.0) * 1.1 
     shift_b = avg_b * (l/100.0) * 1.1 
     final[x][y][1] = a + shift_a 
     final[x][y][2] = b + shift_b 

final = cv.cvtColor(final, cv.COLOR_LAB2BGR) 
final = np.hstack((res, final)) 
show(final) 
saveimg(final) 

私は結果

代わりの

を取得しています:

はgrayworld仮定では、例えば、私は次のコードを使用します違う?

+0

'cv.imread()'はデフォルトでBGRになりますか?私はそれがRGBを使用すると仮定していたが、今はドキュメントを見つけることができない。それが問題だろうか? ... NVMはドキュメントを見つけ、デフォルトでBGRを使用します。 – norok2

+0

@norokこれはhttp://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.htmlにあります。「カラー画像の場合、デコードされた画像はBGR順にチャンネルが保存されます" – Saptarshi

答えて

3

実装しているドキュメントは、8ビットの色深度の場合、LAB definitionのCV内部規約を認識していません。特に

L: L/100 * 255 
A: A + 128 
B: B + 128 

Iはアレイ全体のための一貫性のある符号なしデータ型を維持しながら一つは輝度の完全にunsigned int8精度を使用することができるので、これは、精度向上のために行われていると考えています。

下記のコードは、あなたのものから順応しています。 ここにはいくつかのマイナーな修正がありますが、入れ子になったforループ内の実際のソースがあります。

from __future__ import (
    division, absolute_import, print_function, unicode_literals) 

import cv2 as cv 
import numpy as np 


def show(final): 
    print('display') 
    cv.imshow('Temple', final) 
    cv.waitKey(0) 
    cv.destroyAllWindows() 

# Insert any filename with path 
img = cv.imread('grayworld_assumption_0.png') 
final = cv.cvtColor(img, cv.COLOR_BGR2LAB) 

avg_a = np.average(final[:, :, 1]) 
avg_b = np.average(final[:, :, 2]) 

for x in range(final.shape[0]): 
    for y in range(final.shape[1]): 
     l, a, b = final[x, y, :] 
     # fix for CV correction 
     l *= 100/255.0 
     final[x, y, 1] = a - ((avg_a - 128) * (l/100.0) * 1.1) 
     final[x, y, 2] = b - ((avg_b - 128) * (l/100.0) * 1.1) 

final = cv.cvtColor(final, cv.COLOR_LAB2BGR) 
final = np.hstack((img, final)) 

show(final) 
cv.imwrite('result.jpg', final) 
関連する問題