2014-12-04 341 views
0

我有这个简单的OpenCV代码来绘制图像的直方图。imshow()和matplotlib()不能一起工作

from PIL import Image 
from numpy import * 
from pylab import * 
import cv2 

image=cv2.imread('/media/755784/New Volume/DATA/Images/opencv.jpg') 

h,w=image.shape[:2] 

cv2.imwrite('/media/755784/New Volume/DATA/Images/result.png',image) 
print h,w 

cv2.imshow("Image",image) 
cv2.waitKey(0)## <-- 

print 'Plotting histogram' 
hist=cv2.calcHist(image,[0],None,[256],[0,256]) 
plt.hist(image.ravel(),256,[0,256]) 
plt.show() 
while True: 
    k=cv2.waitKey(30) 
    if k==27: 
     break 
cv2.destroyAllWindows() 

当我(0)之后,imshow()删除waitKey,直方图获取第一绘图,除非您关闭的情节,不显示图像。这是python或matplotlib的特定问题吗?

+1

你阅读文档[这里](http://docs.opencv.org/trunk/doc/py_tutorials/py_gui /py_image_display/py_image_display.html)似乎说你必须使用'waitKey'? – BrenBarn 2014-12-04 07:28:12

+1

使用cv2.waitKey(1)##非阻塞 – berak 2014-12-04 07:29:48

+0

我同意cv2.waitKey(1)或cv2.waitKey(0)将正确显示两个窗口,但5秒后图像窗口失去其亮度。就像蟒蛇正在失去那个窗口的焦点..当你关闭绘图窗口,图像窗口重新获得其亮度.. – 2014-12-04 08:50:55

回答

1

您的plt.show()会阻止代码,因此您无法进入while循环。

但是你也可以用matplotlib绘制图像。这使得它更容易:

import matplotlib.pyplot as plt 
import cv2 

image=cv2.imread('/tmp/stinkbug.png') 

fig = plt.figure(figsize=(10,3)) 
ax1 = plt.subplot(1,2,1) 
ax1.imshow(image) 
ax2 = plt.subplot(1,2,2) 
ax2.hist(image.ravel(),256,[0,256]) 
plt.show() 

(注:我用不同的图像)

+0

好方法..谢谢.. – 2014-12-04 10:26:48

+0

如果这个答案解决了你的问题,请考虑[接受它]( http://stackoverflow.com/help/someone-answers)。这也会让其他人清楚,你不需要任何进一步的帮助(关于这个主题)。 – hitzg 2014-12-04 10:34:19