2016-10-25 2 views
1

TensorFlow newbie 여기, a simple tutorial에 대한 교육은 실패했습니다. 요점은 이미지를 회색조로 변환하는 것입니다.tf.reduce_mean & tf.concat을 사용한 회색 음영 변환

우리의 데이터는 기본적으로 HxWx3 (그림의 높이, 너비 및 3 가지 값 r, g, b의 색상)입니다.

따라서 각 배열 셀을 [r, g, b]에서 [gray, gray, gray]으로 변환하는 것과 동일 할 수도 있습니다. gray = mean(r, g, b)이 맞습니까?

따라서 평균 기능에 대한 문서를 확인한 결과 reduce_mean이 발견되었습니다. 색상 축 (즉, 축 = 2)에서 사용한 다음 축 2를 사용하여 결과를 다시 연결하여 평균 값을 "복제"하고 마지막으로 빨강, 녹색 및 파랑으로 회색 값 (= 평균)을 3 배 얻습니다.

아래 코드를 참조하십시오 :

import tensorflow as tf 
import matplotlib.image as mpimg 

filename = "MarshOrchid.jpg" 
raw_image_data = mpimg.imread(filename) 

image = tf.placeholder("uint8", [None, None, 3]) 

# Reduce axis 2 by mean (= color) 
# i.e. image = [[[r,g,b], ...]] 
# out = [[[ grayvalue ], ... ]] where grayvalue = mean(r, g, b) 
out = tf.reduce_mean(image, 2, keep_dims=True) 

# Associate r,g,b to the same mean value = concat mean on axis 2. 
# out = [[[ grayvalu, grayvalue, grayvalue], ...]] 
out = tf.concat(2, [out, out, out]) 

with tf.Session() as session: 
    result = session.run(out, feed_dict={image: raw_image_data}) 

print(result.shape) 
plt.imshow(result) 
plt.show() 

(You can get original image here)

enter image description here

이 코드가 실행하지만 결과가 ok가 될 수있다. 내 변수를 확인하고, 아래 스크린 샷에 보여 주었다, 평균 확인 아니라고 밝혀 무슨 일이 있었는지

When grayscale fails

궁금, (147, 137, 88)! = 평균 38

enter image description here

아이디어가 있으십니까? 내가 뭘 잘못했는지 알 수는 없지만 ...

고마워! (때문에 오버 플로우의) 평균을 계산하기 전에 pltrdy

답변

2

변경 DTYPE은 :

오류는 자리의 DTYPE에서 왔습니다. 형식 유추가 발생하므로 중급 텐서는 255 (2^8-1)보다 큰 값을 가질 수 없습니다. Tensorflow가 평균 (147, 137, 88)을 계산할 때 먼저 sum (147,137,88) = 372, 그러나 372> 256을 계산하므로 372 %를 유지합니다 256 = 116.

그리고 이렇게 137, 88) = sum (147, 137, 88)/3 = 116/3 = 40 자리 표시 자의 dtype을 "uint16"또는 "uint32"로 변경하십시오.

결과 UINT16로 전환 (정말 잘 설득하지?) : pyplot 사양에 맞게 그것을 음모를 꾸미고 전에

enter image description here

변경 DTYPE 다시 UINT8에

:

(see lib doc about imshow) 가 있음을 언급 : uint8이어야합니다. 몇 가지 이유 때문에 uint16을 사용하면 효과가 없습니다 (이전의 회색 음영 변환에서 어두운 영역이 흰색이라는 뜻입니다).

실행 직전에 tf.cast을 사용하여 uint_로 돌아갑니다 (예 :실제로

enter image description here

+0

: out = tf.cast(out, tf.uint8))은 아래의 좋은 그레이 스케일 변환을 제공합니다! 좋은 직업 & thx. 그래도 색상이 거꾸로 된 것처럼 보입니다 (이미지의 어두운 부분이 회색 음영에 가까워짐). 이상하다, 내가 조사 할거야. 다른 질문이있어. – pltrdy

+0

해결 된 문제 – pltrdy

관련 문제