10

I'm using skimage to crop a rectangle in a given image, now I have (x1,y1,x2,y2) as the rectangle coordinates, then I had loaded the image

 image = skimage.io.imread(filename)
 cropped = image(x1,y1,x2,y2)

However this is the wrong way to crop the image, how would I do it in the right way in skimage

Sandipan Dey
  • 21,482
  • 2
  • 51
  • 63
user824624
  • 7,077
  • 27
  • 106
  • 183

4 Answers4

28

This seems a simple syntax error.

Well, in Matlab you can use _'parentheses'_ to extract a pixel or an image region. But in Python, and numpy.ndarray you should use the brackets to slice a region of your image, besides in this code you is using the wrong way to cut a rectangle.

The right way to cut is using the : operator.

Thus,

from skimage import io
image = io.imread(filename)
cropped = image[x1:x2,y1:y2]
Darleison Rodrigues
  • 579
  • 1
  • 7
  • 22
  • 35
    Isn't `image[y1:y2, x1:x2]` more correct here, given that x refers to the horizontal axis? – iver56 Jul 03 '17 at 21:35
10

One could use skimage.util.crop() function too, as shown in the following code:

import numpy as np
from skimage.io import imread
from skimage.util import crop
import matplotlib.pylab as plt

A = imread('lena.jpg')

# crop_width{sequence, int}: Number of values to remove from the edges of each axis. 
# ((before_1, after_1), … (before_N, after_N)) specifies unique crop widths at the 
# start and end of each axis. ((before, after),) specifies a fixed start and end 
# crop for every axis. (n,) or n for integer n is a shortcut for before = after = n 
# for all axes.
B = crop(A, ((50, 100), (50, 50), (0,0)), copy=False)

print(A.shape, B.shape)
# (220, 220, 3) (70, 120, 3)

plt.figure(figsize=(20,10))
plt.subplot(121), plt.imshow(A), plt.axis('off') 
plt.subplot(122), plt.imshow(B), plt.axis('off') 
plt.show()

with the following output (with original and cropped image):

enter image description here

Sandipan Dey
  • 21,482
  • 2
  • 51
  • 63
2

You can crop image using skimage just by slicing the image array like below:

image = image_name[y1:y2, x1:x2]

Example Code :

from skimage import io
import matplotlib.pyplot as plt

image = io.imread(image_path)
cropped_image = image[y1:y2, x1:x2]
plt.imshow(cropped_image)
0

you can go ahead with the Image module of the PIL library

from PIL import Image
im = Image.open("image.png")
im = im.crop((0, 50, 777, 686))
im.show()
Aman Khan
  • 38
  • 1
  • 7
Pyd
  • 6,017
  • 18
  • 52
  • 109