tutorial multiplicar multiplicacion matrices español elementos ejemplos array agregar python image numpy geometry

python - multiplicar - numpy tutorial español pdf



Cómo escribir formas geométricas simples en matrices numpy (4)

Me gustaría generar una matriz numpy de 200x200 elementos en tamaño y poner en ella un círculo centrado en 100,100 coordenadas, radio 80 y ancho de trazo de 3 píxeles. ¿Cómo hacer esto en Python 2.7 sin involucrar operaciones de archivos? Posiblemente usando geometría o bibliotecas de imágenes para permitir la generalización a otras formas.


opencv new python bindings import cv2 create numpy arrays como el formato de imagen predeterminado

Incluyen funciones de dibujo


Cairo es una biblioteca de gráficos 2D moderna, flexible y rápida. Tiene enlaces de Python y permite crear "superficies" basadas en matrices NumPy:

import numpy import cairo import math data = numpy.zeros((200, 200, 4), dtype=numpy.uint8) surface = cairo.ImageSurface.create_for_data( data, cairo.FORMAT_ARGB32, 200, 200) cr = cairo.Context(surface) # fill with solid white cr.set_source_rgb(1.0, 1.0, 1.0) cr.paint() # draw red circle cr.arc(100, 100, 80, 0, 2*math.pi) cr.set_line_width(3) cr.set_source_rgb(1.0, 0.0, 0.0) cr.stroke() # write output print data[38:48, 38:48, 0] surface.write_to_png("circle.png")

Este código imprime

[[255 255 255 255 255 255 255 255 132 1] [255 255 255 255 255 255 252 101 0 0] [255 255 255 255 255 251 89 0 0 0] [255 255 255 255 249 80 0 0 0 97] [255 255 255 246 70 0 0 0 116 254] [255 255 249 75 0 0 0 126 255 255] [255 252 85 0 0 0 128 255 255 255] [255 103 0 0 0 118 255 255 255 255] [135 0 0 0 111 255 255 255 255 255] [ 1 0 0 97 254 255 255 255 255 255]]

mostrando algún fragmento aleatorio del círculo. También crea este PNG:


La forma habitual es definir una malla de coordenadas y aplicar las ecuaciones de su forma. Para hacerlo, la forma más fácil es usar numpy.mgrid :

http://docs.scipy.org/doc/numpy/reference/generated/numpy.mgrid.html

# xx and yy are 200x200 tables containing the x and y coordinates as values # mgrid is a mesh creation helper xx, yy = numpy.mgrid[:200, :200] # circles contains the squared distance to the (100, 100) point # we are just using the circle equation learnt at school circle = (xx - 100) ** 2 + (yy - 100) ** 2 # donuts contains 1''s and 0''s organized in a donut shape # you apply 2 thresholds on circle to define the shape donut = numpy.logical_and(circle < (6400 + 60), circle > (6400 - 60))


Otra posibilidad es usar scikit-image . Puedes usar circle_perimeter para un hueco o circle para un círculo completo.

Puedes dibujar un círculo de trazo simple como ese:

import matplotlib.pyplot as plt from skimage import draw arr = np.zeros((200, 200)) rr, cc = draw.circle_perimeter(100, 100, radius=80, shape=arr.shape) arr[rr, cc] = 1 plt.imshow(arr) plt.show()

También puede emular un trazo utilizando un loop . En este caso, debe usar la versión antialias para evitar artefactos:

import matplotlib.pyplot as plt from skimage import draw arr = np.zeros((200, 200)) stroke = 3 # Create stroke-many circles centered at radius. for delta in range(-(stroke // 2) + (stroke % 2), (stroke + 1) // 2): rr, cc, _ = draw.circle_perimeter_aa(100, 100, radius=80+delta, shape=arr.shape) arr[rr, cc] = 1 plt.imshow(arr) plt.show()

Una forma probablemente más eficiente es generar dos círculos completos y "restar" el interno del externo:

import matplotlib.pyplot as plt from skimage import draw arr = np.zeros((200, 200)) stroke = 3 # Create an outer and inner circle. Then subtract the inner from the outer. radius = 80 inner_radius = radius - (stroke // 2) + (stroke % 2) - 1 outer_radius = radius + ((stroke + 1) // 2) ri, ci = draw.circle(100, 100, radius=inner_radius, shape=arr.shape) ro, co = draw.circle(100, 100, radius=outer_radius, shape=arr.shape) arr[ro, co] = 1 arr[ri, ci] = 0 plt.imshow(arr) plt.show()

Los dos métodos arrojan de hecho resultados ligeramente diferentes.