Issue
I have a jpeg from where I want to crop a portion containing graph (the one in the bottom portion).
As of now I used this code to achieve the same:
from PIL import Image
img = Image.open(r'D:\aakash\graph2.jpg')
area = (20, 320, 1040, 590)
img2 = img.crop(area)
# img.show()
img2.show()
But I achieved this by guessing the x1, y1, x2, y2 multiple times to arrive at this (guess work).
I'm totally novice in image cropping based on some logic. How can I successfully crop all graphs to create separate images given the positions are same?
Update: I believe, it is not a possible duplicate of that problem because, even though logically that's same, but the way the clustering logic will work is different. In that question, there are only 2 vertical white lines to divide, but here, there's two horizontal and two vertical lines, and I hardly have a clue on how to use KMeans to solve this kind of image clustering.
Help from someone who's an expert with sklearn's KMeans to solve this kind of problem shall be highly appreciated.
Solution
Here's another way to do it, but using PIL/Pillow and skimage
rather than OpenCV:
#!/usr/local/bin/python3
import numpy as np
from PIL import Image, ImageFilter
from skimage.measure import label, regionprops
# Load image and make Numpy version and greyscale PIL version
pim = Image.open('article.jpg')
n = np.array(pim)
pgr = pim.convert('L')
# Threshold to make black and white
thr = pgr.point(lambda p: p < 230 and 255)
# Following line is just for debug
thr.save('result-1.png')
# Median filter to remove noise
fil = thr.filter(ImageFilter.MedianFilter(11))
# Following line is just for debug
fil.save('result-2.png')
# Make Numpy version for skimage to use
nim = np.array(fil)
# Image is now white blobs on black background, so label() it
label_image=label(nim)
# Iterate through blobs, saving each to disk
i=0
for region in regionprops(label_image):
if region.area >= 100:
# Extract rectangle containing blob and save
name="blob-" + str(i) + ".png"
minr, minc, maxr, maxc = region.bbox
Image.fromarray(n[minr:maxr,minc:maxc,:]).save(name)
i = i + 1
That gives these output images:
And the intermediate, debug images are result-1.png
:
and result-2.png
:
Answered By - Mark Setchell Answer Checked By - Marilyn (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.