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 inpyplot
s rendering 的好方法。只是be mindful 的 Python 3 兼容性以上是关于Ipython笔记本(jupyter),opencv(cv2)和绘图?的主要内容,如果未能解决你的问题,请参考以下文章
如何腌制或存储 Jupyter (IPython) 笔记本会话以供以后使用
Ipython/Jupyter:等待 kernel_info 回复超时
如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?