descricao_projeto_ihistologia.txt 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. ---
  2. 2020/09/05
  3. Definimos um modelo que funcionara' em 2 passos, um preparatorio (a ser implementado em Python) e um iMA:
  4. 1. Administrativo: fora do Moodle, para inserir a imagens gigantes.
  5. A ideia basica daqui e' ter varias representacoes da imagem original, em niveis de resolucao, sendo que
  6. a resolucao da imagem no nivel k e' metade daquela do nivel k+1.
  7. Se juntar todas as imagens de determinado nivel, teremos a imagem completa, como num mosaico (mas com variado nivel de resolucao).
  8. Entao precisaremos fazer alguns codigos para quebrar as imagens, registrando varias camadas
  9. em forma de arvore binaria: uma imagem de nivel k, no nivel k+1 origina 4 outras
  10. (cada uma com o "dobro" do tamanho, tanto em linhas qto em colunas, da imagem de nivel anterior).
  11. Assim, cada imagem original (gigante) resultara' um log(N) niveis de imagens (se N for o nivel da arvore), todas
  12. elas serao arquivadas em um servidor que o Moodle tera' acesso, usando o mecanismo
  13. de seguranca do Moodle (ninguem tera' acesso `as imagens diretamente).
  14. 2. Gerenciamento: via Moodle.
  15. Aqui estao os recursos internos ao Moodle, o professor associa uma tarefa a
  16. alguma das imagens cadastradas no passo 1 e faz as marcacoes das regioes que
  17. correspondem a uma resposta correta (digamos marcou retangulos r1, r2, ... rk).
  18. O aluno entra na atividade, recebe a imagem em sua menor resolucao (nivel 0 da
  19. arvore) e navega pela imagem (pode ampliar, reduzir e mover). Nos locais que
  20. imagina ter encontrado os objetos desejamos, pegar o marcador de regiao e a marca.
  21. Quando finalizar as marcacoes, clica no botao de enviar.
  22. O servidor (Moodle) recebe um arquivo texto com as marcas do aluno e o registra.
  23. O professor pode depois entrar no ambiente e ver quais alunos enviou atividade,
  24. se acertou ou errou e, se desejar, entrar na resposta de determinado aluno.
  25. 1. Mais detalhes do processamento separado para gerar os diretorios com a arvore de cada imagem.
  26. Isso poderia ser feito por um programa implementado em Python.
  27. Precisa ser rodado em uma maquina potentente, para cada imagem gerara um grande numero de imagens menores, em forma hierarquica.
  28. A imagem do nivel 0 sera' a de menor resolucao (talvez 5Mb, digamos com 4000 x 3000 pixels). No diretorio: 0/
  29. As 4 imagens de nivel 1, cada uma tera' a mesma resolucao da imagem nivel 0. Nos diretorios: 0/0/; 0/1/; 0/2/; 0/3/
  30. As 4^2 imagens de nivel 2, cada com mesma resolucao 4000x3000. Nos diretorios: 0/0/0 - 0/0/3; 0/1/0 - 0/1/3; 0/2/0 - 0/2/3; 0/3/0 - 0/3/3
  31. As 4^k imagens de nivel k, cada 4000x3000. Cada diretorio do nivel k-1 dara' origem a outros 4: x/y/...z/0; x/y/...z/1; x/y/...z/2; x/y/...z/3
  32. A geracao das imagens e' feita em ordem inversa (partindo da imagem gigante) e gerando as imagens menores.
  33. Assim e' preciso calcular o valor do nivel maximo k de tal forma que a imagem original dividida por 2^k gere uma imagem com 4000 linhas (ou 3000 colunas).
  34. Para simplificar, vamos supor que a imagem original ja' esteja na escala 4 x 3.
  35. Denotemos a Wi = 4000 (e Hi = 3000)
  36. 1.1 Achar o valor de k
  37. Seja W x H o tamanho a imagem original
  38. Qual natural k que gera W/2^k = Wi => 2^k = W/Wi (e aplicando log na base 2) => k*log(2) = log(2^k) = log(W/Wi) = log(W)-log(Wi)
  39. Lembrando que para log na base 2: log(x) = y <=> 2^y = x (1)
  40. Acima usamos que log(v^p)=p*log(v) e agora usando que log da divisao = subtracao dos logs, obtemos que
  41. k = log(W) - log(Wi) (2)
  42. 1.2 Gerar as imagens
  43. - nivel k: dividir a imagem original em 2*2^k imagens, cada uma de tamanho Wi x Hi (dividir por 2 em largura e por 2 em altura)
  44. pois 2^k * Wi = 2^(log(W) - log(Wi)) * Wi = (2^log(W) / 2^log(Wi)) * Wi (3)
  45. e usando a relacao (1), supondo que xw=log(W) e xwi=log(Wi) entao: 2^xw = W e 2^xwi = Wi, assim podemos re-escrevemos (3) como
  46. 2^k * Wi = (2^log(W) / 2^log(Wi)) * Wi = (2^xw / 2^xwi) * Wi = (W / Wi) * Wi = W c.q.d.
  47. - nivel k-1: para cada 4 imagens vizinhas, 2 imagens por coluna e as 2 imagens linha, serao juntadas gerando uma imagem de metada da resolucao original
  48. ou seja, como cada uma das 2*2^k imagens do nivel k tem tamanho Wi x Hi, entao 4 delas serao fundidas em uma unica com resolucao Wi x Hi
  49. - nivel k-2: para cada 4 imagens vizinhas, 2 imagens por coluna e as 2 imagens linha, serao juntadas gerando uma imagem de metada da resolucao Wi x Hi
  50. ...
  51. - nivel 0: dividir cada 4 imagens do nivel 1 (2 por linha e 2 por coluna), gerando uma imagem de metada da resolucao Wi x Hi
  52. 1.3 Estrutura de diretorios em que as imagens serao arquivadas
  53. Nivel 0/
  54. 0 +
  55. 0/ 1/ | 2/ 3/
  56. 1 +----------------------------------------+----------------------------------------+----------------------------------------+
  57. 0/ 1/ | 2/ 3/ 0/ 1/ | 2/ 3/ 0/ 1/ | 2/ 3/ 0/ 1/ | 2/ 3/
  58. 2 +------------+------------+------------+ +------------+------------+------------+ +------------+------------+------------+ +------------+------------+------------+
  59. | | | | | | | | | | | | | | | |
  60. 3 + + + + + + + + + + + + + + + +
  61. x o arquivo daqui estaria em 0/1/1/0_1_1.png
  62. 2. O iMA (iHistologia) devera' se comportar como os mapas de alta-resolucao, o usuario pode "se mover" pelo mapa.
  63. Sem mudar a resolucao, quando o usuario passa do limite direito da imagem 0_1_1.png, devemos carregar a imagem 0_1_2.png (e desocupar a 0_1_0.png)
  64. Ao aplica um "zoom in", devemos pegar as 4 imagens correspondentes no nivel abaixo (com o dobro de linhas e o dobro de colunas).