Ipython笔记本(Jupyter),OpenCV(cv2)和绘图?

27
有没有一种方法可以在Jupyter笔记本中使用OpenCV2并绘制图形?

我对Python图像分析还比较新。我决定采用笔记本工作流程,以便在处理过程中进行良好的记录,并且使用matplotlib / pylab来绘制图表效果非常好。我最初遇到的一个障碍是如何在笔记本内绘制图形。很容易,只需使用魔法命令:
%matplotlib inline

后来,我想用交互式图表进行操作,但在专用窗口中绘制图表总是会冻结。好吧,我再次学到了你需要使用魔法。而不是仅仅导入模块:

%pylab

现在我开始使用opencv。我又面临同样的问题,即根据手头的任务要么内联绘图,要么使用专用的交互式窗口。有类似的魔法可以使用吗?还是有其他方法可以使事情正常运行?或者我需要回到从IDLE运行程序的方式?

另外一件事:我知道opencv已经正确安装。第一,因为我在安装或导入cv2模块时没有收到任何错误。第二,因为我可以使用cv2读取图像,然后用其他东西绘制它们。


我发现在“cv2.imshow()”命令之后使用“cv2.waitKey()”命令可以解决外部窗口冻结的问题,但我不知道为什么。我还看到在这里提到了一些其他命令:http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html - Fire
我不确定是否可以在IPython笔记本中嵌入cv2 namedWindow,因为它是一个C++框架。可能没有为cv2.imshow编写后端。我会使用pylab中的imshow进行嵌入。这个cv2.startWindowThread()在笔记本上工作了吗?我很好奇。 - otterb
它对我没用。一个空的外部窗口弹出并冻结了。 - Fire
3个回答

41

这是我的空模板:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
%matplotlib inline

im = cv2.imread('IMG_FILENAME',0)
h,w = im.shape[:2]
print(im.shape)
plt.imshow(im,cmap='gray')
plt.show()

查看在线示例


h,w 可以用于什么? - Moondra
h和w分别对应于图像的高度和宽度大小。 - themadmax
2
如果您使用 cv2 读取图像并使用 plt 显示图像,请小心。 cv2 默认情况下将图像读取为BGR格式,而 plt 使用RGB格式。 因此,您的蓝色和红色颜色将会翻转。 在这里,您可以使用 cv2.imread 中的 0 参数以灰度方式读取图像,因此您不会遇到此问题。 - Maunesh Ahir
2
你是对的,我们必须使用 cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 来显示彩色图像。 - themadmax

6

对于在Python 3.5上运行的Jupyter笔记本,我需要进行以下修改:

import io
import cv2
import numpy as np
from IPython.display import clear_output, Image, display
import PIL.Image

def showarray(a, fmt='jpeg'):
    a = np.uint8(np.clip(a, 0, 255))
    f = io.BytesIO()
    PIL.Image.fromarray(a).save(f, fmt)
    display(Image(data=f.getvalue()))

可以工作,但根据您读取图像的方式可能需要使用 cv2.cvtColor - ringo

2

还有一个小函数,在Google Deepdream笔记本中使用:

import cv2
import numpy as np
from IPython.display import clear_output, Image, display
from cStringIO import StringIO
import PIL.Image

def showarray(a, fmt='jpeg'):
    a = np.uint8(np.clip(a, 0, 255))
    f = StringIO()
    PIL.Image.fromarray(a).save(f, fmt)
    display(Image(data=f.getvalue()))

那么您可以执行以下操作:
img = cv2.imread("an_image.jpg") 

只需简单地:
showarray(img)

每次需要在单元格中呈现图像。

2
这是避免pyplot渲染问题的好方法。只需注意Python 3的兼容性即可。 - Ciprian Tomoiagă

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接