Skip to main content

Wrapper around ndarray and opencv for rapid prototyping

Project description

Coat


Coat is small wrapper that sits on numpy's ndarray (subclassed) and opencv
Coat's only purpouse is for rapid prototyping


Style

Coat is using method cascading
return from every method is Coat's HigherCoating instance
Only exception is method classic() which returns back numpy instance\

Install

preferably use virtual env

pip install coat

Demo

function Coat is a proxy function that handles different types of args.

It handles str(url), list/generator of images and ndarray.

from coat import Coat

url = "https://natgeo.imgix.net/subjects/headers/shutterstock_276228476.jpg?auto=compress,format&w=1920&h=960&fit=crop"
Coat(url).thresh(125,255).show()

Usage

Content

Core functionalities
Dominance
Array manipulation
Image downloading
Labeling
Color spaces
Helper functions
Montage
Contours
Color filtering
Motion difference


Core functionalities

Lets define two arrays of different type, size and dimension

# Import Coat(proxy function) and Montage
from coat import Coat, Montage
import numpy as np

array1 = Coat(np.zeros(shape=[40,60,3],dtype=np.uint8))
array2 = Coat(np.zeros(shape=[8,8],dtype=np.float32))
Auto resolver

Coating the arrays you let Coat resolve array operations whenever there is conflict

res = array1 + array2

res.shape,res.dtype
>>> (40, 60, 3) uint8

Coated arrays can be dominant or non-dominant. General rules are as follows:

A(non-dominant) + B(non-dominant) -> A is prioritized
A(non-dominant) + B(dominant)     -> B is prioritized
A(dominant) + B(non-dominant)     -> A is prioritized
A(dominant) + B(dominant)         -> A is prioritized
Dominance setting

You can set which array is dominant Be default each array is not dominant.

res = array1 * array2.host()
res.shape,res.dtype
>>> (8, 8) float32

If have arrays of different size and dimension( gray & colored), you can simply transform to common standard as follows

list_of_images = [img1,img2, img3, .., .., imgN]

# define common standard
grayscale_template = Coat(np.zeros(shape=[100,100],dtype=np.uint8))
colored_template = Coat(np.zeros(shape=[100,100],dtype=np.uint8))

grascaled = [grayscale_template.host() + image for image in list_of_images]
colored =   [colored_template.host() + image for image in list_of_images]
interpolation

You can set interpolation algorithm (default is LINEAR - BILINEAR)

res = array1 - array2.host('CUBIC')
Removing dominance
res = array1 * array2.host('CUBIC').guest()
res.shape,res.dtype
>>> (40, 60, 3) uint8

Array manipulation

osize as objective size
array1.shape, array2.shape
>>> (40, 60, 3) , (8,8)
array1.osize(array2.shape).shape
>>> (8,8,3)
array2.osize(array1.shape).shape
>>> (40, 60)
rsize as relative size
res = array2.rsize(fx = 2, fy=0.5)
res.shape
>>> (16, 4)
ndarray compatibility
res = array1 + np.zeros(shape=array1.shape)
np.uint8(array1) # -> returns back Coat instance with changed datatype
array1.classic() # -> returns back numpy instance

Leveraging OpenCV

Download image

pass url to Coat and show it

url = "https://natgeo.imgix.net/subjects/headers/shutterstock_276228476.jpg?auto=compress,format&w=1920&h=960&fit=crop"
image = Coat(url).show()
image = image.rsize(fx=0.25,fy=0.25)

Supports labeling
# Use int for objective coordinates
image.labelbox("Home",(0,136),(230,340), bcolor = [0,255,0]).show()
# Use float for relative coordinates
image.labelbox("Home",(0.0,0.3),(0.9,0.7), bcolor = [0,255,0]).show()

Colorspace change

supported color transformation

BGR2GRAY
BGR2HLS
BGR2HSV
HSV2BGR
GRAY2RGB
GRAY2BGR
RGB2GRAY
RGB2HSV
RGB2HLS
image.color_to('BGR2GRAY')
NOTE

OpenCV is using BGR as default color scheme

Image processing helpers

Threshold

image.thresh(125,255,'thresh_binary').show()

Convolution filtering

image.blur_median
image.filter_bilateral
image.blur_gauss
image.blur_average

Convolution 2D

img.conv(kernel)
Montage

See orignal next to processed image
we add host (turn on dominance of first image) so we get result in RGB colorspace as our original image is rgb

image.rsize(fx=0.3,fy=0.3).host().join(image.thresh(127,255)).show()

Montage of different color spaces

img = image.rsize(fx=0.3,fy=0.3)
color_spaces = ["BGR2GRAY","BGR2HLS","BGR2HSV",]

Dominant is the first image if template is not defined

all_images = [img] + [img.to_color(cspace) for cspace in color_spaces]
montage = Montage(all_images).grid(2,2).show()

resize montage based on template

montage = Montage(all_images).template(np.zeros(shape=[50,50,3],dtype=np.uint8)).grid(2,2)
Remove stars with morphological opening
image.morphologyEx('open',3).show()

Contours
# Draw quick countours
thr = image.thresh(200,255)

# copy 
contoured = image.copy().contours(thr,min_size=5, max_size = 9999999,thickness=2,color = [0,125,255]).show()

Replace particular color
present = [0,125,255]
future = [255,0,0]
contoured.replace(present,future).show()

Color filtering
# [36,0,0] --> green color interval in HSV <--[70,255,255]
image.filterHsv([36,0,0],[70,255,255],passband=True).show()
image.filterHsv([36,0,0],[70,255,255],passband=False).show()
# Passband False:   -------|++|----- 
# Passband True:   ++++++|--|++++++ 

passband True

passband False

Motion difference
box1 = Coat(np.zeros(shape=[400,400,3])).box((30,30),(250,250),color=[255,125,0])
box2 = Coat(np.zeros(shape=[400,400,3])).box((30,150),(250,350),color=[255,125,0])

motion_diff = box1.motion_difference(box2,val=30).show()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

coat-0.6.tar.gz (14.1 kB view details)

Uploaded Source

File details

Details for the file coat-0.6.tar.gz.

File metadata

  • Download URL: coat-0.6.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.5

File hashes

Hashes for coat-0.6.tar.gz
Algorithm Hash digest
SHA256 47750f12f187e34abd779a39aeba0afd94b4a3719df8a02fd27497426007b821
MD5 10fab62e3d2dd9f37c4278c3bdaa833b
BLAKE2b-256 efe60996f3ab8a7331bc42772aadf6aab732d5ce1910924a397f91158be067d0

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page