示例#1
0
def img_without_bck(img, filtro=1, n=3):

    #Si la imagen es a color se convierte a niveles de gris
    if (len(img.shape)  > 2):
        img = color.rgb2gray(img)

    #Imagen del fondo estimado
    bck = np.zeros(img.shape)

    #Imagen sin el fondo
    out = np.zeros(img.shape)
        
    #AQUÍ: Empice su código
    
    #Convierte la imagen original a float    
    img = util.img_as_ubyte(img);
    
    #Aplica el filtro para estimar el fondo
    if (filtro == 1):
        bck = filters.rank.mean(img, np.ones((n,n)));
    elif (filtro == 2):
        bck = filters.rank.median(img, np.ones((n,n)));
    elif (filtro == 3):
        bck = filters.rank.maximum(img, np.ones((1,n)));
    elif (filtro == 4):
        bck = filters.rank.maximum(img, np.ones((n,1)));
    else:
        print("debe ingresar un filtro valido");
        return;
    
    #Convierte la imagen original y el fondo a float
    bck = util.img_as_float(bck);
    img = util.img_as_float(img);
    
    #Los valores que estén en negativos los setea como 0 y los que estén sobre 1 les pone 1
    out = np.clip((bck - img), 0, 1);
    
    #Convierte la imagen a blanco y negro
    out2 = np.zeros(out.shape);
    out2[out >= 0.05] = 1;
    
    #Mostramos el resultado
    skdemo.imshow_all(img, bck, out2, size=7, titles=["Original", "Fondo", "Bordes"] )
    
    return bck, out
示例#2
0
def img_enhance(img):
    #AQUÍ: Empice su código
    
    #Si la imagen es a color se convierte a niveles de gris
    if (len(img.shape)  > 2):
        img = color.rgb2gray(img)
        
    #Convierte la imagen original a float    
    img = util.img_as_float(img);
    
    #Aplicamos el filtro de la mediana con una mascara de 3*3
    img2 = filters.rank.median(img, np.ones((3,3), dtype=float));
    #Convertimos la imagen a float
    img2 = np.clip(util.img_as_float(img2), 0, 1);
    
    #Obtener los bordes horizontales    
    # Creamos la mascara kernel    
    k1 = np.array([[1, -2, 1]]);
    
    # Aplicamos el filtro para obtener los bordes horizontales
    img3 = scipy.signal.convolve2d(img2, k1, mode='same', boundary='fill', fillvalue=0);
    img3 = np.clip(img3, 0, 1);    
    
    #Obtener los bordes verticales    
    # Creamos la mascara kernel    
    k2 = np.array([[1],
                   [-2],
                   [1]]);
    
    # Aplicamos el filtro para obtener los bordes verticales
    img4 = scipy.signal.convolve2d(img2, k2, mode='same', boundary='fill', fillvalue=0);
    img4 = np.clip(img4, 0, 1);
    
    # Obtiene los pixel maximos entre las imágenes de bordes verticales y horizontales
    img5 = np.maximum(img3, img4);        
    
    # Suma los bordes a la imagen original
    img6 = np.clip(img + img5, 0, 1);
    
    #Mostramos el resultado
    titles = ["Original", "bordes horizontales", "bordes verticales", "Máximos entre bordes", "imagen resaltada"];
    skdemo.imshow_all(img, img3, img4, img5, img6, size=7, titles=titles);
# Cargamos una de las imágenes en niveles de gris
cat = color.rgb2gray(data.chelsea())

# Revisamos el tipo de la imagen
print ("Tipo de dato de la imagen Original: ", img.dtype)

# Como la imagen es floante debemos pasarla a uint8 o untin16
# El tipo de la imagen debe cambiar porque la función solo recibe imágenes enteras
cat = util.img_as_ubyte(cat)
print ("Tipo de dato de la imagen convertida: ", img.dtype)

# Aplicamos el filtro promedio de 5x5 usando skimage
avg = filters.rank.mean(cat, np.ones((5,5)))

# Mostramos las imágenes
skdemo.imshow_all(cat, avg, titles=["Imagen Original", "Imagen Promedio"])


# Filtro de Suavizado Gaussiano¶
# El filtro Gaussiano es el filtro clásico de suavizado y es muy similar al filtro promedio. Sin embargo, 
# el filtro Gaussiano no pondera de igual manera a todos los píxeles en el vecindario: los píxeles qué 
# están más cerca al píxel central tienen mayor peso que aquellos que están más alejados de este.

# Creamos una matriz de zeros y cambiamos el valor del píxel central
m = np.zeros((5,5))
m[2,2] = 1

# Usamos la función del paquete filters para generar la máscara
k_gauss = filters.gaussian(m, sigma=0.5)
print("Kernel con sigma = 0.5:\n", np.array_str(k_gauss, precision=3,  suppress_small=True))
示例#4
0
def imshow_edges(image, horizontal_edge_kernel, vertical_edge_kernel):
    horizontal_edges = convolve(image, horizontal_edge_kernel)
    vertical_edges = convolve(image, vertical_edge_kernel)
    skdemo.imshow_all(horizontal_edges, vertical_edges)
示例#5
0
# In[2]:

import skdemo
from skimage import data
color_image = data.chelsea()

red_image = np.zeros_like(color_image)
green_image = np.zeros_like(color_image)
blue_image = np.zeros_like(color_image)

red_image[:, :, 0] = color_image[:, :, 0]
green_image[:, :, 1] = color_image[:, :, 1]
blue_image[:, :, 2] = color_image[:, :, 2]

skdemo.imshow_all(red_image, green_image, blue_image)

# Alternatively, we can "unpack" our RGB image into red, green, and blue channels using `np.rollaxis`

# In[3]:

np.rollaxis(color_image, axis=-1).shape

# The `axis` argument tells `rollaxis` which axis to... ahem... roll to the front.

# In[4]:

red_image = np.zeros_like(color_image)
green_image = np.zeros_like(color_image)
blue_image = np.zeros_like(color_image)
from skimage import morphology           # Para crear el kernel de convolución en los filtros no lienales

# Con este nos aseguramos que las imagenes en niveles de gris, se vean como tal siempre.
plt.rcParams['image.cmap'] = 'gray'
plt.rcParams['image.interpolation'] = 'none'

# Leemos una de las imágenes de prueba de la practica
color_image = io.imread('imagenes/balloon.jpg')

# Pasamos la imagen al espacio de color Lab: L=luminancia, a y b definen el color real o tono
lab_image = color.rgb2lab(color_image)
lab_image.shape

#Observe que al cambiar el espacio de color, las dimensiones de la imagen no cambian en absoluto. 
# Sin embargo, visualicemos la imagen ...
skdemo.imshow_all(color_image, lab_image, titles=["Imagen Original", "Imagen Lab"])

# La función imshow visualiza una imagen en RGB, sin embargo, las matrices de la imagen en el espacio Lab no 
# se parecen en nada a las matrices de una imagen RGB.

# Dicho esto, hay un cierto parecido con la imagen en RBG. Observe, la información de cada canal:
skdemo.imshow_all(lab_image[..., 0], lab_image[..., 1], lab_image[..., 2],
                 titles=['L', 'a', 'b'])
                
# Parte de la gama de colores RGB en el espacio Lab se pueden visualizar a continuación, para valores específicos de luminancia.
# Note que la información de color es más uniforme en el espacio Lab que en el espacio RGB. Es más, estos se aproximan más a 
# la forma como el ojo humano percibe los colores.         

# En Skimage las funciones para los espacios de color son las siguientes:

# rgb2yiq: Convierte de RGB a YIQ
示例#7
0

# In[2]:

import skdemo
plt.rcParams['image.cmap'] = 'spectral'
from skimage import io, segmentation as seg, color

url = '../images/spice_1.jpg'
image = io.imread(url)


# In[3]:

labels = seg.slic(image, n_segments=18, compactness=10)
skdemo.imshow_all(image, labels.astype(float) / labels.max())
print labels


# We can try to create a nicer visualization for `labels`: each segment will be represented by its average color.

# In[4]:

def mean_color(image, labels):
    out = np.zeros_like(image)
    for label in np.unique(labels):
        indices = np.nonzero(labels == label)
        out[indices] = np.mean(image[indices], axis=0)
    return out

skdemo.imshow_all(image, mean_color(image, labels))
示例#8
0
plt.rcParams['image.cmap'] = 'gray'
plt.rcParams['image.interpolation'] = 'none'

# We've already discussed edge filtering, using the Sobel filter, in the last section.

# In[2]:

import skdemo
from skimage import data
# Rename module so we don't shadow the builtin function
import skimage.filter as filters

image = data.camera()
pixelated = image[::10, ::10]
gradient = filters.sobel(pixelated)
skdemo.imshow_all(pixelated, gradient)

# With the Sobel filter, however, we get back a grayscale image, which essentially tells us the likelihood that a pixel is on the edge of an object.
#
# We can apply a bit more logic to *detect* an edge; i.e. we can use that filtered image to make a *decision* whether or not a pixel is on an edge. The simplest way to do that is with thresholding:

# In[3]:

skdemo.imshow_all(gradient, gradient > 0.4)

# That approach doesn't do a great job. It's noisy and produces thick edges. Furthermore, it doesn't use our *knowledge* of how edges work: They should be thin and tend to be connected along the direction of the edge.

#### Canny edge detector

# The Canny edge detector combines the Sobel filter with a few other steps to give a binary edge image. The steps are as follows:
# * Gaussian filter
示例#9
0
# <codecell>

import skdemo

# Uncomment and press <TAB> to see available functions in `skdemo`
#skdemo.  # <TAB>   


# <codecell>

# This code is just a template to get you started.
red_image = np.ones((1,1)) # TODO: replace with your code
green_image = np.ones((1,1)) # TODO
blue_image = np.ones((1,1)) # TODO

skdemo.imshow_all(color_image, red_image, green_image, blue_image)   


# <markdowncell>
# <subslide>
# Or, simply use ``matplotlib.subplots``:


# <codecell>

fig, axes = plt.subplots(1, 4, figsize=(10,2))
axes[0].imshow(color_image)
axes[1].imshow(green_image)
# etc...   

示例#10
0
print mean_kernel.sum()


# Note that all the values of the kernel sum to 1. Why might that be important? Sure, a definition of a mean requires this property, but why might this be a favorable property for many image filters?

#### Downsampled image

# Let's consider a real image now. It'll be easier to see some of the filtering we're doing if we downsample the image a bit. We can slice into the image using the "step" argument to sub-sample it:

# In[13]:

from skimage import data

image = data.camera()
pixelated = image[::10, ::10]
skdemo.imshow_all(image, pixelated)


# Here we use a step of 10, giving us every tenth column and every tenth row of the original image. You can see the highly pixelated result on the right.

#### Mean filter on a real image

# Now we can apply the filter to this downsampled image:

# In[14]:

filtered = convolve(pixelated, mean_kernel)
skdemo.imshow_all(pixelated, filtered)


# Comparing the filtered image to the pixelated image, we can see that this filtered result is smoother: Sharp edges (which are just borders between dark and bright pixels) are smoothed because dark pixels reduce the intensity of neighboring pixels and bright pixels do the opposite.
示例#11
0
from skimage import io
color_image = io.imread('../images/balloon.jpg')

# In[16]:

import skdemo
#skdemo.  # <TAB>

# In[17]:

# This code is just a template to get you started.
red_image = np.zeros_like(color_image)
green_image = np.zeros_like(color_image)
blue_image = np.zeros_like(color_image)

skdemo.imshow_all(color_image, red_image, green_image, blue_image)

# ---

##### Combining color-slices with row/column-slices

# In the examples above, we just manipulate the last axis of the array (i.e. the color channel). As with any NumPy array, however, slicing can be applied to each axis:

# In[18]:

color_patches = color_image.copy()
# Remove green (1) & blue (2) from top-left corner.
color_patches[:100, :100, 1:] = 0
# Remove red (0) & blue (2) from bottom-right corner.
color_patches[-100:, -100:, (0, 2)] = 0
plt.imshow(color_patches)
示例#12
0
# Filtro Mediana¶
# Este es uno de los filtros más usados para suavizar una imagen dado que preserva los bordes de la misma mientras elimina el ruido.

# Al igual que con los filtros espaciales tradicionales, el filtro mediana centra el kernel de convolución en cada 
# pixel de la misma, reemplazando su valor por la mediana entre todos los valores que cubre el kernel. 
# Este filtro funciona muy bien para eliminar el ruido, especialmente el ruido de tipo impulsivo. 
# El siguiente ejemplo muestra cómo usar el filtro mediana en una imagen con ruido "sal y pimienta". 
# Además, la imagen se filtra usando un filtro gaussiano para fines de comparación.

# Cargamos la imagen y le agregamos ruido
img = skimage.img_as_ubyte(data.camera())
img_noisy = util.random_noise(img, "s&p")

# Mostramos las imágenes
skdemo.imshow_all(img, img_noisy, titles=["Imagen Original", "Imagen con Ruido S&P"])

# Kernel de convolución
k = morphology.square(3)

# Se aplica el filtro mediana
img_median = filters.rank.median(img_noisy, k)

# Se aplica el filtro gaussiano
img_gauss = filters.gaussian(img_noisy, sigma=1.0)

skdemo.imshow_all(img_median, img_gauss, titles=["Filtro Mediana", "Filtro Gaussiano"]);

#Visualizando los detalles
skdemo.imshow_all(img_median[100:200, 200:400], img_gauss[100:200, 200:400]);
示例#13
0
# <codecell>

protein, centromeres, chromosomes = image.transpose((2, 0, 1))   


# <markdowncell>
# Getting the centromeres is easy because the signal is so clean:



# <codecell>

from skimage.filter import threshold_otsu
centromeres_binary = centromeres > threshold_otsu(centromeres)
skdemo.imshow_all(centromeres, centromeres_binary)   


# <markdowncell>
# But getting the chromosomes is not so easy:



# <codecell>

chromosomes_binary = chromosomes > threshold_otsu(chromosomes)
skdemo.imshow_all(chromosomes, chromosomes_binary, cmap='gray')   


# <markdowncell>
# Let's try using an adaptive threshold:
示例#14
0
# <codecell>

ic = io.ImageCollection('../images/pano/DFM_*')   


# <markdowncell>
# The ``ImageCollection`` class provides an easy way of
# loading and representing multiple images.  Images are not
# read from disk until accessed.



# <codecell>

imshow_all(ic[0], ic[1])   


# <markdowncell>
# Credit: Photographs taken in Petra, Jordan by François Malan<br/>
# License: CC-BY



# <codecell>

image0 = rgb2gray(ic[0][:, 500:500+1987, :])
image1 = rgb2gray(ic[1][:, 500:500+1987, :])

image0 = transform.rescale(image0, 0.25)
image1 = transform.rescale(image1, 0.25)   
示例#15
0
# método ISODATA
# Método Otsu
# Método de Yen
# Método de Li (basado en entreopía)
# Veamos como usar los tres primeros y veamos los resultados en ambas imágenes:

# Método Adaptativo

# Revise la documentación a fin de que conozca los parámetros de la función
t1 = filters.threshold_local(img_1, 15, 'mean')
t2 = filters.threshold_local(img_2, 81, 'gaussian')

img_BW_1 = img_1 > t1
img_BW_2 = img_2 > t2

skdemo.imshow_all(img_BW_1, img_BW_2, titles=["Arroz umbral Adaptativo - Mean", "Coins umbral Adaptativo - Mean"])

# Método ISODATA

# Revise la documentación a fin de que conozca los parámetros de la función
t1 = filters.threshold_isodata(img_1)
t2 = filters.threshold_isodata(img_2);

img_BW_1 = img_1 > t1;
img_BW_2 = img_2 > t2;

skdemo.imshow_all(img_BW_1, img_BW_2, titles=["Arroz umbral isodata", "Coins umbral isodata"])

# Método yen

# Revise la documentación a fin de que conozca los parámetros de la función
sq = morphology.square(width=3)
dia = morphology.diamond(radius=1)
print(sq)
print(dia)   


# <markdowncell>
# The central value of the structuring element represents the pixel being
# considered, and the surrounding values are the neighbors: a 1 value means that
# pixel counts as a neighbor, while a 0 value does not. So:



# <codecell>

skdemo.imshow_all(image, morphology.erosion(image, sq), shape=(1, 2))   


# <markdowncell>
# and



# <codecell>

skdemo.imshow_all(image, morphology.dilation(image, sq))   


# <markdowncell>
# and