Ipython笔记本(jupyter),opencv(cv2)和绘图?

Posted

技术标签:

【中文标题】Ipython笔记本(jupyter),opencv(cv2)和绘图?【英文标题】:Ipython notebook (jupyter),opencv (cv2) and plotting? 【发布时间】:2016-04-11 04:05:18 【问题描述】:

有没有办法通过 ipython notebook 使用 opencv2 和绘图?

我对 python 图像分析相当陌生。我决定在我处理过程中使用笔记本工作流程来制作良好的记录,并且使用 matplotlib/pylab 进行绘图的效果非常好。

我遇到的最初障碍是如何在笔记本中绘制内容。简单,只需使用魔法:

%matplotlib inline

后来,我想使用交互式绘图执行操作,但在专用窗口中绘图总是会冻结。好吧,我又知道你需要使用魔法。而不是仅仅导入模块:

%pylab

现在我开始使用 opencv。我现在又回到了同样的问题,我要么想内联绘图,要么根据手头的任务使用专用的交互式窗口。有没有类似的魔法可以使用?还有另一种方法可以让事情正常进行吗?还是我被卡住了,需要回到从 IDLE 运行程序?

附带说明:我知道 opencv 已正确安装。首先,因为我在安装或导入 cv2 模块时都没有出错。其次,因为我可以用 cv2 读取图像,然后用其他东西绘制它们。

【问题讨论】:

我发现在“cv2.imshow()”命令之后的命令“cv2.waitKey()”可以解决外部窗口的冻结问题——但不知道为什么。我还看到了这里提到的其他一些命令:txt.arboreus.com/2012/07/11/… 我不确定你是否可以将 cv2 namedWindow 嵌入到 IPython 笔记本中,因为它是一个 C++ 框架。可能没有为 cv2.imshow 编写后端。我会使用 pylab 的 imshow 进行嵌入。这个 cv2.startWindowThread() 对笔记本有用吗?我很好奇。 它对我不起作用。一个空白的外部窗口弹出并冻结。 【参考方案1】:

这是我的空模板:

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()

See online sample

【讨论】:

h,w 可以用来做什么? h和w对应Height和Width图片尺寸 如果您使用 cv2 读取图像并使用 plt 显示图像,请小心。 cv2 默认将图像读取为 BGR,而 plt 使用 RGB 格式。所以你的蓝色和红色会被翻转。在这里,您正在使用cv2.imread 中的0 参数读取灰度图像,因此您不会看到此问题。 你说得对,我们必须使用cv2.cvtColor(image, cv2.COLOR_BGR2RGB)来显示彩色图像【参考方案2】:

对于在 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()))

【讨论】:

【参考方案3】:

Google Deepdream Notebook 中还使用了那个小功能:

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)

每次需要在单元格中渲染图像

【讨论】:

这是避免problems in pyplots rendering 的好方法。只是be mindful 的 Python 3 兼容性

以上是关于Ipython笔记本(jupyter),opencv(cv2)和绘图?的主要内容,如果未能解决你的问题,请参考以下文章

更改级别记录到 IPython/Jupyter 笔记本

如何腌制或存储 Jupyter (IPython) 笔记本会话以供以后使用

Ipython/Jupyter:等待 kernel_info 回复超时

如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?

为啥 PyQt4 在 Jupyter 和 IPython 笔记本之间的行为不同?

jupyter笔记本中的Ipython错误,没有堆栈跟踪