2013-08-22 2 views
2

Matplotlib (그레이 스케일)로 표시하려는 비디오 스트림에서 오는 일련의 이미지가 있습니다. 왠지 나는 그들을 색으로 완벽하게 표시 할 수는 있지만 회색 음영으로 변환 할 때는 그렇지 않습니다.matplotlib을 사용하여 그레이 스케일 이미지 업데이트

나는 많은 이미지를 가지고 있기 때문에 훨씬 더 빠르기 때문에 imshow(image) 대신 set_data(image)을 사용하고 있습니다. 컬러 이미지는이 두 명령 모두에서 제대로 작동하지만 그레이 스케일은 imshow()에서만 작동합니다. set_data()을 사용하면 어떤 데이터를 전송했는지에 관계없이 흑백 이미지 만 표시됩니다.

여기에 무슨 일이 일어날 지 모릅니다.

내 코드는 참조 용입니다. 중요한 점을 강조하여 중요한 부분을 강조했지만 다른 문제가 발생했을 때를 대비하여 다른 모든 코드를 포함했습니다. 나머지 코드는 기본적으로 카메라의 이미지로 채워지는 대기열을 설정하고이를 가져올 때 표시하려고합니다.

import matplotlib.pyplot as plt 
from matplotlib import cm 
from cv_bridge import CvBridge, CvBridgeError 
import cv 
from collections import deque 
import rospy 
from sensor_msgs.msg import Image 
import numpy as np 

class CameraViewer(): 

    def __init__(self, root='navbot'): 

    self.root = root 
    self.im_data = deque() 
    self.bridge = CvBridge() # For converting ROS images into a readable format 

    self.im_fig = plt.figure(1) 
    self.im_ax = self.im_fig.add_subplot(111) 
    self.im_ax.set_title("DVS Image") 
    self.im_im = self.im_ax.imshow(np.zeros((256, 256),dtype='uint8'), cmap=plt.cm.gray) # Blank starting image 
    #self.im_im = self.im_ax.imshow(np.zeros((256, 256),dtype='float32'), cmap=plt.cm.gray) # Tried a different format, also didn't work 
    self.im_fig.show() 
    self.im_im.axes.figure.canvas.draw() 

    def im_callback(self, data): 

    cv_im = self.bridge.imgmsg_to_cv(data, "mono8") # Convert Image from ROS Message to greyscale CV Image 
    im = np.asarray(cv_im) # Convert from CV image to numpy array 
    #im = np.asarray(cv_im, dtype='float32')/256 # Tried a different format, also didn't work 
    self.im_data.append(im) 

    def run(self): 

    rospy.init_node('camera_viewer', anonymous=True) 

    sub_im = rospy.Subscriber(self.root + '/camera/image', Image, self.im_callback) 

    while not rospy.is_shutdown(): 
     if self.im_data: 
     im = self.im_data.popleft() 

     ####################################################### 
     # The following code is supposed to display the image: 
     ####################################################### 

     self.im_im.set_cmap('gray') # This doesn't seem to do anything 
     self.im_im.set_data(im) # This won't show greyscale images 
     #self.im_ax.imshow(im, cmap=plt.cm.gray) # If I use this, the code runs unbearably slow 
     self.im_im.axes.figure.canvas.draw() 

def main(): 

    viewer = CameraViewer(root='navbot') 
    viewer.run() 

if __name__ == '__main__': 
    main() 

답변

6

데이터의 최소 및 최대가 변경되고 있습니다. im.set_data 그냥 데이터를 맹목적으로 설정 - 그것은 색 배율을 업데이트하려고하지 않습니다.

처음에는 모두 0의 배열을 플롯하므로 imshow은 이미지를 0과 0 사이의 크기로 조정합니다 (작은 퍼지 인수 포함). 그러나 업데이트 할 데이터의 범위는 0에서 255 사이입니다.

a) 이미지를 처음 플롯 할 때 데이터의 vminvmax을 최대 범위로 설정하거나 b) 이미지를 업데이트 할 때마다 데이터의 최소 및 최대 값으로 색 한계를 업데이트하십시오 (im.set_clim 사용).

데이터가 uint8이라고 생각하기 때문에 처음에는 빈 이미지를 그릴 때 vminvmax을 지정하는 것이 가장 좋습니다.

일을보십시오 :

# Blank starting image 
self.im_im = self.im_ax.imshow(np.zeros((256, 256)), cmap=plt.cm.gray, 
           vmin=0, vmax=255) 
+0

감사합니다! 그 완벽하게 일했다 :) – Brent

관련 문제