My work requires applying Local Binary Operator on Images. For that I have already converted the images in Gray then implemented a Connected Components analysis on the image also.
Here is the Code:
Adding Libraries
import numpy as np import pandas as pd import matplotlib.pyplot as plt from skimage.io import imread, imshow from skimage.color import rgb2gray from skimage.morphology import (erosion, dilation, closing, opening,area_closing, area_opening) from skimage.measure import label, regionprops, regionprops_table
Rendering the image
plt.figure(figsize=(6,6)) painting = imread("E:/Project/for_annotation/Gupi Gain0032.jpg") plt.imshow(painting); plt.figure(figsize=(6,6))
Binarizing Image
gray_painting = rgb2gray(painting) binarized = gray_painting<0.55 plt.imshow(binarized);
4.Declaring Kernel
square = np.array([[1,1,1],
[1,1,1],
[1,1,1]])
Dilation function
def multi_dil(im, num, element=square): for i in range(num): im = dilation(im, element) return im
Erosion function
def multi_ero(im, num, element=square): for i in range(num): im = erosion(im, element) return im
Functions Applied
plt.figure(figsize=(6,6)) multi_dilated = multi_dil(binarized, 7) area_closed = area_closing(multi_dilated, 50000) multi_eroded = multi_ero(area_closed, 7) opened = opening(multi_eroded) plt.imshow(opened);
Label function
plt.figure(figsize=(6,6)) label_im = label(opened) regions = regionprops(label_im) plt.imshow(label_im);
Extract features
properties = ['area','convex_area','bbox_area', 'extent', 'mean_intensity','solidity', 'eccentricity', 'orientation'] pd.DataFrame(regionprops_table(label_im, gray_painting, properties=properties))
Filtering Regions
masks = [] bbox = [] list_of_index = [] for num, x in enumerate(regions): area = x.area convex_area = x.convex_area if (num!=0 and (area>100) and (convex_area/area <1.05) and (convex_area/area >0.95)): masks.append(regions[num].convex_image) bbox.append(regions[num].bbox) list_of_index.append(num) count = len(masks)
Extracting Images
fig, ax = plt.subplots(2, int(count/2), figsize=(15,8)) for axis, box, mask in zip(ax.flatten(), bbox, masks): red = painting[:,:,0][box[0]:box[2], box[1]:box[3]] * mask green = painting[:,:,1][box[0]:box[2], box[1]:box[3]] * mask blue = painting[:,:,2][box[0]:box[2], box[1]:box[3]] * mask image = np.dstack([red,green,blue]) axis.imshow(image) plt.tight_layout() plt.figure(figsize=(6,6)) rgb_mask = np.zeros_like(label_im) for x in list_of_index: rgb_mask += (label_im==x+1).astype(int) red = painting[:,:,0] * rgb_mask green = painting[:,:,1] * rgb_mask blue = painting[:,:,2] * rgb_mask image = np.dstack([red,green,blue]) plt.imshow(image);
I am getting an error.
ValueError: Number of columns must be a positive integer, not 0