python cv2下载速度慢_使用python(OpenCV)在图像中进行像素迭代非常慢

I am aware of iterating through pixels and accessing their values using OpenCV with C++. Now, i am trying to learn python myself and i tried to do the same thing in python. But when i am running the following code, it takes a lot of time (~7-10 seconds) to display the image. And the script keeps running on for few more seconds even after displaying the image.

I found a similar question here at SO but i am not able to understand how do i use numpy in my case (because i am a beginner in python) and whether or not it is really required?

Code Explanation: I am just trying to put the black pixels on the left and right side of the image.

import numpy as np

import cv2 as cv

#reading an image

img = cv.imread('image.jpg')

height, width, depth = img.shape

for i in range(0, height):

for j in range(0, (width/4)):

img[i,j] = [0,0,0]

for i in range(0, height):

for j in range(3*(width/4), width):

img[i,j] = [0,0,0]

cv.imshow('image',img)

cv.waitKey(0)

解决方案

(note: I'm not familiar with opencv, but this appears to be a numpy issue)

The "terribly slow" part is that you're looping in python bytecode, rather than letting numpy loop at C speed.

Try directly assigning to a (3-dimensional) slice that masks the region you want to zero out.

import numpy as np

example = np.ones([500,500,500], dtype=np.uint8)

def slow():

img = example.copy()

height, width, depth = img.shape

for i in range(0, height): #looping at python speed...

for j in range(0, (width//4)): #...

for k in range(0,depth): #...

img[i,j,k] = 0

return img

def fast():

img = example.copy()

height, width, depth = img.shape

img[0:height, 0:width//4, 0:depth] = 0 # DO THIS INSTEAD

return img

np.alltrue(slow() == fast())

Out[22]: True

%timeit slow()

1 loops, best of 3: 6.13 s per loop

%timeit fast()

10 loops, best of 3: 40 ms per loop

The above shows zeroing out the left side; doing the same for the right side is an exercise for the reader.

If the numpy slicing syntax trips you up, I suggest reading through the indexing docs.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值