Explorando el Recurso de Datos de Imágenes#
Para descargar imágenes del recurso de datos de imágenes (IDR), solo necesitas un enlace, por ejemplo, para solicitar los datos en formato tif. Luego puedes usar scikit-image para abrir la imagen.
Algunos de los ejemplos de código mostrados a continuación fueron adaptados del sitio web de la API de IDR licenciado por la Universidad de Dundee y Open Microscopy Environment bajo la Licencia Internacional Creative Commons Attribution 4.0.
En el siguiente ejemplo, descargamos datos de imágenes de Stojic et al compartidos bajo la licencia CC BY 4.0 disponibles en el IDR bajo esta URL: https://idr.openmicroscopy.org/webclient/?show=screen-2302 Ver también la publicación relacionada: https://www.nature.com/articles/s41467-020-14978-7
from skimage.io import imread, imshow
import json
import requests
original_link = 'https://idr.openmicroscopy.org/webclient/render_image_download/9629351/?format=tif'
edited_link = 'https://idr.openmicroscopy.org/webclient/render_image/9629351/'
image = imread(edited_link)
imshow(image)
<matplotlib.image.AxesImage at 0x1ce26571730>
Además, puedes ensamblar el enlace a partir de un enlace genérico si conoces el identificador de la imagen que deseas descargar.
generic_image_url = "https://idr.openmicroscopy.org/webclient/render_image/{image_id}/"
image_id = 9629351
# combinar url genérica con ID de imagen
image_url = generic_image_url.format(**{"image_id":image_id})
# descargar y mostrar imagen
image = imread(image_url)
imshow(image)
<matplotlib.image.AxesImage at 0x1ce280c7880>
La interfaz de programación de aplicaciones (API) de IDR también te permite navegar técnicamente por la base de datos. La imagen mostrada arriba es parte de la pantalla 2303. Primero, echaremos un vistazo a la anotación de metadatos proporcionada con este conjunto de datos.
# configurar qué conjunto de datos navegar
screen_id = 2302
MAP_URL = "https://idr.openmicroscopy.org/webclient/api/annotations/?type=map&{type}={screen_id}"
# abrir una interfaz a internet
with requests.Session() as session:
# convertir la MAP_URL genérica en una URL específica para la pantalla
qs = {'type': 'screen', 'screen_id': screen_id}
url = MAP_URL.format(**qs)
# recorrer todas las anotaciones e imprimirlas
for a in session.get(url).json()['annotations']:
namespace = a['ns']
for v in a['values']:
key = v[0]
value = v[1]
print (key, value)
Screen A https://idr.openmicroscopy.org/webclient/?show=screen-2301
Screen B https://idr.openmicroscopy.org/webclient/?show=screen-2302
Screen C https://idr.openmicroscopy.org/webclient/?show=screen-2303
Overview https://idr.openmicroscopy.org/webclient/?show=screen-2304
Sample Type cell
Organism Homo sapiens
Study Title Identification of long noncoding RNAs in regulation of cell division
Study Type high content screen
Screen Type primary screen
Screen Technology Type RNAi screen
Imaging Method spinning disk confocal microscopy
Publication Title A long noncoding RNA regulates microtubule behaviour during mitosis
Publication Authors Stojic L, Lun ATL, Mascalchi P, Ernst C, Redmond AM, Mangei J, Cooper S, Barr AR, Taylor C, Franklin VNR, Bakal C, Marioni JC, Odom DT, Gergely F
PubMed ID 32296040 https://www.ncbi.nlm.nih.gov/pubmed/32296040
PMC ID PMC7160116 https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7160116
Publication DOI 10.1038/s41467-020-14978-7 https://doi.org/10.1038/s41467-020-14978-7
Release Date 2020-03-03
License CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
Copyright Stojic et al
Data Publisher University of Dundee
Data DOI 10.17867/10000133b https://doi.org/10.17867/10000133b
BioStudies Accession S-BIAD3 https://www.ebi.ac.uk/biostudies/studies/S-BIAD3
Annotation File idr0056-screenB-annotation.csv https://github.com/IDR/idr0056-stojic-lncrnas/blob/HEAD/screenB/idr0056-screenB-annotation.csv
A continuación, podemos recorrer los subconjuntos de datos. Estamos viendo un conjunto de datos de cribado de alto contenido (HCS), que típicamente se organiza en placas. Un bucle for nos permite echar un vistazo a las placas disponibles.
PLATES_URL = "https://idr.openmicroscopy.org/webclient/api/plates/?id={screen_id}"
qs = {'screen_id': screen_id}
# ensamblar una URL específica a partir de la URL genérica
url = PLATES_URL.format(**qs)
# recorrer todas las placas
for p in session.get(url).json()['plates']:
plate_id = p['id'] # nota, usaremos esta variable más adelante
print (p['id'], p['name'], p['childCount'])
7361 1977 1
7368 1978 1
7366 1981 1
7367 1982 1
7379 1983 0
7369 1984 1
7371 1985 1
7370 1986 1
7372 1987 1
7375 1988 1
Las placas están organizadas en pocillos (en el mundo digital podrías llamarlos tablas) y por lo tanto, podemos recorrer todos los pocillos de manera similar a como recorremos las placas. Esta vez, nos detendremos después de la primera fila de imágenes para ver solo un par de miniaturas pequeñas de ellas. Mirar miniaturas tiene mucho sentido mientras no necesites los datos completos de la imagen y solo estés navegando por la base de datos.
WELLS_IMAGES_URL = "https://idr.openmicroscopy.org/webgateway/plate/{plate_id}/{field}/"
THUMBNAIL_URL = "https://idr.openmicroscopy.org/webclient/render_thumbnail/{image_id}/"
qs = {'plate_id': plate_id, 'field': 0}
url = WELLS_IMAGES_URL.format(**qs)
grid = session.get(url).json()
rowlabels = grid['rowlabels']
collabels = grid['collabels']
# recorrer el pocillo de imágenes.
for row in grid['grid']:
for cell in row:
if cell is not None:
# leer información específica de la imagen, usaremos esta variable más adelante
image_id = cell['id']
# imprimir ID de imagen y mostrar miniatura
print(image_id)
thumbnail = imread(THUMBNAIL_URL.format(**{'image_id':image_id}))
imshow(thumbnail)
# salir después de la primera imagen
break
# salir después de la primera fila
break
9762957
Para recuperar la imagen completa, podemos usar el código mostrado en la parte superior.
generic_image_url = "https://idr.openmicroscopy.org/webclient/render_image/{image_id}/"
# combinar url genérica con ID de imagen
image_url = generic_image_url.format(**{"image_id":image_id})
# descargar y mostrar imagen
image = imread(image_url)
imshow(image)
<matplotlib.image.AxesImage at 0x1ce2836e1c0>
Además, podemos imprimir los metadatos usando json. Nota: Podemos echar un vistazo a los metadatos sin descargar la imagen.
qs = {'image_id': image_id}
IMAGE_DETAILS_URL = "https://idr.openmicroscopy.org/webclient/imgData/{image_id}/"
url = IMAGE_DETAILS_URL.format(**qs)
r = session.get(url)
if r.status_code == 200:
print (json.dumps(r.json(), indent=4, sort_keys=True))
{
"channels": [
{
"active": true,
"coefficient": 1.0,
"color": "FF0000",
"emissionWave": null,
"family": "linear",
"inverted": false,
"label": "alpha-tubulin (microtubule cytoskeleton)",
"reverseIntensity": false,
"window": {
"end": 187.0,
"max": 65535.0,
"min": 0.0,
"start": 0.0
}
},
{
"active": true,
"coefficient": 1.0,
"color": "00FF00",
"emissionWave": null,
"family": "linear",
"inverted": false,
"label": "gamma-tubulin (centrosomes)",
"reverseIntensity": false,
"window": {
"end": 342.0,
"max": 65535.0,
"min": 0.0,
"start": 0.0
}
},
{
"active": true,
"coefficient": 1.0,
"color": "0000FF",
"emissionWave": null,
"family": "linear",
"inverted": false,
"label": "phospho-histone H3 serine 10 (mitotic cells)",
"reverseIntensity": false,
"window": {
"end": 117.0,
"max": 65535.0,
"min": 0.0,
"start": 1.0
}
},
{
"active": false,
"coefficient": 1.0,
"color": "FF0000",
"emissionWave": null,
"family": "linear",
"inverted": false,
"label": "Hoechst (DNA)",
"reverseIntensity": false,
"window": {
"end": 381.0,
"max": 65535.0,
"min": 0.0,
"start": 0.0
}
}
],
"id": 9762957,
"init_zoom": 0,
"interpolate": true,
"meta": {
"datasetDescription": "",
"datasetId": null,
"datasetName": "Multiple",
"imageAuthor": "Public data",
"imageDescription": "",
"imageId": 9762957,
"imageName": "1988 [Well A-1; Field #1]",
"imageTimestamp": 1404512029.0,
"pixelsType": "uint16",
"projectDescription": "",
"projectId": null,
"projectName": "Multiple",
"wellId": 1475376,
"wellSampleId": ""
},
"perms": {
"canAnnotate": false,
"canDelete": false,
"canEdit": false,
"canLink": false
},
"pixel_range": [
0,
65535
],
"pixel_size": {
"x": 0.6459,
"y": 0.6459,
"z": null
},
"rdefs": {
"defaultT": 0,
"defaultZ": 0,
"invertAxis": false,
"model": "color",
"projection": "normal"
},
"size": {
"c": 4,
"height": 493,
"t": 1,
"width": 659,
"z": 1
},
"split_channel": {
"c": {
"border": 2,
"gridx": 3,
"gridy": 2,
"height": 992,
"width": 1985
},
"g": {
"border": 2,
"gridx": 2,
"gridy": 2,
"height": 992,
"width": 1324
}
},
"tiles": false
}