Kva*_*Dub 0 python opencv image matplotlib python-imaging-library
import numpy as np
from matplotlib import cm
from matplotlib import pyplot as plt
import Image
from scipy import ndimage
import Image, ImageDraw
import PIL
import cv
import cv2
from scipy.ndimage import measurements, morphology
from PIL import Image
from numpy import *
from scipy.ndimage import filters
import pylab
import mahotas
from mamba import*
import mambaDraw
from PIL import Image, ImageDraw
img = np.asarray(Image.open('test.tif').convert('L'))
img = 1 * (img < 127)
draw = ImageDraw.Draw(img)
draw.line((100,200, 150,300), fill=128)
plt.imshow(img, cmap=cm.Greys_r)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我想在图像上放置一些网格线,但出现以下错误:
Traceback (most recent call last):
File "C:\Documents and Settings\All Users.WINDOWS\?????????line 24, in <module>
draw = ImageDraw.Draw(img)
File "C:\Python27\lib\site-packages\PIL\ImageDraw.py", line 296, in Draw
return ImageDraw(im, mode)
File "C:\Python27\lib\site-packages\PIL\ImageDraw.py", line 61, in __init__
im.load()
AttributeError: 'numpy.ndarray' object has no attribute 'load'
Run Code Online (Sandbox Code Playgroud)
这段代码有什么问题?如何在图像上放置 100x100 网格?
您的错误是您将 PIL 图像转换为 numpy 数组,但随后您使用了 PIL ImageDraw在 numpy 数组上库。
您可以在 PIL 或 Numpy 中绘制线条,无论您喜欢哪种,但您需要使用 Numpy 来处理 Numpy 对象和 PIL 来处理 PIL 对象。Saullo 展示了如何在 PIL 中做到这一点,在 numpy 中你可以这样做:
img[:, 100:110] = 0
Run Code Online (Sandbox Code Playgroud)
或者对于 10 像素宽的网格,每 100 个:
for i in range(100,1000,100):
img[i:i+10,:] = 0
img[:,i:i+10] = 0
Run Code Online (Sandbox Code Playgroud)
附带说明一下,您的导入有点疯狂,并且弄乱了您的命名空间。对于你正在做的事情,你可以这样做:
import numpy as np
import Image, ImageDraw
# and for a reasonable import of other packages you've listed
from matplotlib import cm
from matplotlib import pyplot as plt
from scipy import ndimage
import cv2
import mahotas
import mambaDraw
Run Code Online (Sandbox Code Playgroud)
例如,您只需要from numpy import *or 之一import numpy as np,但是一旦您已经导入它,将其重新导入为其他名称会使事情变得复杂。