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)
OpenCV is a pre-built, open-source CPU-only library (package) that is widely used for computer vision, machine learning, and image processing applications. It supports a good variety of programming languages including Python.
putImageData(imgData, 0, 0); The image will then change according to the changes you made to its pixel array. Each pixel contains 4 components red, green, blue, alpha - each of them is number 0-255. The loop starts from top-left to bottom-right.
(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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With