Reputation: 407
So I have an 800 x 600 image that I want to cut vertically into two equally sized pictures using OpenCV 3.1.0. This means that at the end of the cut, I should have two images that are 400 x 600 each and are stored in their own PIL variables.
Here's an illustration:
Thank you.
EDIT: I want the most efficient solution so if that solution is using numpy splicing or something like that then go for it.
Upvotes: 20
Views: 18648
Reputation: 21
you can define following function to simply slice every image you want to two vertical parts.
def imCrop(x):
height,width,depth = x.shape
return [x[height , :width//2] , x[height, width//2:]]
and then you can simply for example plot the right part of the image by:
plt.imshow(imCrop(yourimage)[1])
Upvotes: 2
Reputation: 101
import cv2
# Read the image
img = cv2.imread('your file name')
print(img.shape)
height = img.shape[0]
width = img.shape[1]
# Cut the image in half
width_cutoff = width // 2
s1 = img[:, :width_cutoff]
s2 = img[:, width_cutoff:]
cv2.imwrite("file path where to be saved", s1)
cv2.imwrite("file path where to be saved", s2)
Upvotes: 4
Reputation: 1128
You can try the following code which will create two numpy.ndarray
instances which you can easily display or write to new files.
from scipy import misc
# Read the image
img = misc.imread("face.png")
height, width = img.shape
# Cut the image in half
width_cutoff = width // 2
s1 = img[:, :width_cutoff]
s2 = img[:, width_cutoff:]
# Save each half
misc.imsave("face1.png", s1)
misc.imsave("face2.png", s2)
The face.png
file is an example and needs to be replaced with your own image file.
Upvotes: 21