Elliot Killick
Elliot Killick

Reputation: 407

How to Cut an Image Vertically into Two Equal Sized Images

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:

Paper being cut into halves

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

Answers (3)

erfan nazari
erfan nazari

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

Shreyansh Dwivedi
Shreyansh Dwivedi

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

fsimkovic
fsimkovic

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

Related Questions