Dual Binário Opção De Definição


Sirengus nam, ar i darb eigoje, danai mintys pradeda suktis apie kiemo aplink. Keletas landafto architekts patarim kaip aplink susiplanuoti patiems. Prie pradedant galvoti apie glynus arba alpinariumus, svarbiausia yra pirmi ingsniai tai funkcinis teritorijos planavimas. Nesuskirsius teritorijos tinkamas zonas, augalai pasodinami dez, kur j visai nereikia, ar iltnamis pastatomas toje vietoje, kur jis Skaityti daugiau. Tel. 370 608 16327 El. p. Infoskraidantikamera. lt Interneto svetain: skraidantikamera. lt Socialiniai tinklai: facebook paskyra Apraymas: Filmuojame 8211 fotografuojame i 70 8211 100 metr aukio naudojant dron. Sukuriame HD raikos nuotraukas ir video siuetus. Silome pasli, sod, mik, medelyn apiros nuotraukas i aukio. Daugiau ms darb pavyzdi rasite interneto Skaityti daugiau. Profesionalios technins, sodo arnos (gera kaina) PVC laistymo arnos: PVC, dviej sluoksni laistymo arna, sutvirtinta tinkleliu i poliesterio silvets ultravioletiniams spinduliams kokybs sertifikatas spalva alia 58 skersmens, 16 mm, 8211 kaina 0.90 Ltm 34 skersmens, 19 mm. 8211 kaina 1,20 Ltm 1 col. Skersmens, 25 mm, 8211 kaina 2.30 Ltm Profesionalios PVC auktos kokybs Skaityti daugiau. Morfologia Binária Atualizado em: 7 de outubro de 2007 Introdução A morfologia binária é um conjunto de operações fundamentais em imagens binárias (conjuntos 2-D de valores booleanos). É uma operação muito simples e não linear de convolução entre dois conjuntos desse tipo. Ao contrário da convolução linear, a morfologia leva o Min e Max dos elementos no conjunto. Um conjunto é a imagem em si, o outro é o núcleo da convolução, que é chamado de elemento estruturante e tem uma origem definida (às vezes chamado de centro). A morfologia binária é extremamente importante para operações de correspondência de imagens rápidas e de baixo nível - todo o sistema de visão de máquina comercial tem por causa da sua utilidade. No período de 1990, se você quisesse fazer correspondência de padrões rápidos, você poderia comprar esse sistema de qualquer uma das várias empresas (veja abaixo). Estas implementaram operações morfológicas binárias em sistemas personalizados com registros largos em operações de aproximadamente 1 bilhão de pixels em segundo lugar. Hoje, usando o método de acumulação de palavras de destino (implementado em Leptonica) em uma CPU de 1 GHz, você pode tornar a morfologia binária até uma ordem de magnitude mais rápida. Então, se você precisar de operações de correspondência rápida em imagens binárias, leia. E se você estiver fazendo análise de imagem em escala de cinza ou imagens em cores, a morfologia binária pode ser usada para fornecer respostas rápidas e espacialmente detalhadas a questões de interesse. Referências e meta-referências Recomendo as seguintes referências para iniciados e praticantes: Álgebra de Imagem Usando Morfologia Matemática por R. M. Haralick, S. R. Sternberg e X. Zhuang, IEEE Trans. PAMI, vol. 9, pp. 532-550, julho de 1987. As primeiras 10 páginas definem as operações básicas de dilatação, erosão, abertura e fechamento binário. Análise de Imagem e Morfologia Matemática por Jean Serra, Academic Press 1982. O tratado clássico, por um dos pioneiros. Análise de Imagem Morfológica, Princípios e Aplicações de Pierre Soille, Springer 1999. Um livro de texto mais moderno com inúmeras aplicações e exemplos. Você pode ter um resumo de 2 páginas da notação comum e definições básicas que são usadas para operadores morfológicos, em ps ou pdf. Luc Vincent possui muitas publicações excelentes sobre aplicações e implementações eficientes da morfologia da imagem. Existe uma excelente bibliografia on-line de 643 referências em morfologia de imagens e tópicos relacionados, até 2003, compilada por Pierre Soille e Henk Heijmans. O que é a morfologia binária Se você está familiarizado com o processamento de imagens morfológicas, pode ignorar esta seção. Existem muitos campos, como linguística computacional, ciência dos materiais e biologia, que utilizam o termo morfológico para descrever os objetos que estudam. Para distinguir-se disto, o processamento de imagens morfológicas às vezes é chamado de morfologia da imagem e morfologia matemática, o último talvez para indicar o grau de abstração que foi alcançado. A morfologia da imagem foi pioneira na França na década de 1960 por Matheron e Serra, e posteriormente desenvolvida na Europa. Mas até o início dos anos 90, a maioria dos processamento de imagem nos EUA era linear: convolução linear e transformações reversíveis. Podem ser utilizadas maquinarias matemáticas pesadas sobre esse processamento linear, mas existem muitas situações em que o processamento de imagens não-linear é necessário, especialmente em aplicações de análise de imagem onde as decisões precisam ser feitas. (Você não pode tomar decisões com operações lineares, o que não permite que você diga sim ou não - apenas graus de talvez.) A negligência nos Estados Unidos dessas operações não-lineares fundamentais me lembra a velha piada sobre alguém que perde suas chaves à noite Mas apenas as busca por uma lâmpada, porque é aí que a luz está. Eu acredito que a primeira tese de doutorado sobre a morfologia da imagem nos EUA foi o trabalho de 1985 sobre filtros não-lineares por Petros Maragos com Ron Schafer no Georgia Tech. Naquela época, várias empresas de visão de máquina foram fundadas em Michigan, em grande parte para fornecer inspeção automatizada para fabricantes locais de automóveis. A morfologia binária foi utilizada como técnica principal porque é rápida, eficiente na memória e fornece rotinas gerais para a correspondência de padrões. Essas empresas venderam hardware de propósito especial porque era lucrativo e era difícil colocar os algoritmos em máquinas de uso geral. Por que foi que, afinal, o Motorola 68020 estava disponível em 1985 e o Intel 386 estava disponível em 1986. Cada um deles era compatível com memória de multiprocessamento com endereçamento de 32 bits. O principal problema era que o DOS e a Intel viviam em um mundo de 16 bits, usando um modelo de memória segmentada de 64K, e era difícil lidar com imagens maiores. E as estações de trabalho unix que foram construídas em torno do 68020 eram relativamente caras. Eles também foram lentos - esses chips funcionaram a alguns MHz, várias centenas de vezes mais lento que os onipresentes chips de 3 GHz que você pode comprar por 100 hoje. Esses sistemas de visão de máquina também foram populares porque foram projetados para serem sistemas especiais para fins especiais (embora nem sempre fosse fácil ativar a chave, especialmente quando você os programou em uma linguagem similar a montagem). E assim, no início 90, havia um mercado para este hardware de propósito especial. Mas o inexorável progresso do microprocessador básico de PC, tanto em velocidade como em ferramentas de software para o desenvolvimento de programas, reduziu muito a demanda por esses sistemas especiais - assim como a Silicon Graphics descobriu que seu negócio com hardware de gráficos de propósito especial foi destruído por barato, Chips Intel e AMD rápidos com desempenho de gráficos gigaflop. Hoje, os processadores são rápidos, a memória é barata e podemos usar a morfologia binária para o padrão de correspondência a velocidades que não foram imaginadas até 10 anos atrás. A morfologia binária é sobre operações em conjuntos. Os conjuntos são pixels ON (preto) em uma imagem bidimensional. Tal como acontece com todas as operações de processamento de imagem, existe uma imagem de origem que é operada para produzir uma imagem de destino. No seguinte, usamos um conjunto de convenções para descrever as operações de erosão e dilatação como operações definidas. Existem outras convenções, e você deve ter isso em mente quando você lê a literatura. As operações básicas de morfologia binária são dilatação e erosão. Em uma imagem binária, nos referimos aos pixels de primeiro plano (preto) de forma diferente como preto, primeiro plano, ON ou 1. Nos referimos aos pixels de fundo (branco) de forma variada como branco, fundo, DESLIGADO ou 0. Falando, a dilatação manuseia o primeiro plano E a erosão melhora o primeiro plano. Essas duas operações são realmente duplas na medida em que uma erosão do primeiro plano é equivalente a uma dilatação do plano de fundo. A diluição pode ser implementada da seguinte forma: comece com uma imagem de destino desmarcada (todos os pixels OFF). Em seguida, faça uma seqüência de operações OR lógicas da imagem de origem com o destino, cada vez com uma mudança específica, conforme determinado por um padrão chamado elemento estruturante (Sel). O Sel é um padrão bidimensional de sucessos. Tudo em relação a uma origem que é muitas vezes referida como o centro do Sel. É também um conjunto. Portanto, há realmente dois conjuntos envolvidos em uma operação morfológica: a imagem e um Sel. Por exemplo, considere um Sel que seja um padrão horizontal de 5 sucessos contíguos (x, y), com origem em (0,0). Então, uma dilatação da imagem por este Sel envolve a inicialização de todos os pixels de destino em OFF e, em seguida, ORing a fonte cinco vezes com mudanças de origem dadas pelos cinco hits no Sel. Uma erosão pode ser implementada de forma semelhante. Por exemplo, você pode inicializar todos os pixels de destino em ON e depois fazer um conjunto de ANDs lógicos entre o dest e a fonte deslocada. Mas há uma diferença importante: você leva a mudança para ser do hit para a origem Sel. Ao invés da origem do golpe. Você pode pensar no Sel como um conjunto de vetores em duas dimensões, e para a erosão, você usa uma inversão desses vetores. Por causa do AND, você acaba com pixels ON no destino somente onde os hits do Sel podem caber nos pixels ON da imagem de origem. De fato, a erosão pode ser implementada colocando Sel com sua origem em cada pixel ON na imagem de origem e, para cada local onde todos os hits no Sel são colocados em ON pixels na imagem, um pixel ON é produzido no Destino na localização da origem Sel. Assim, a erosão é uma operação de correspondência de padrões. A inversão do Sel para a erosão é necessária para tornar a erosão uma dupla dilatação. A receita de erosão que acabamos de dar é simplificada demais, veja a discussão na próxima seção sobre condições de fronteira. A inversão do Sel para a erosão também é necessária para fazer a abertura. Que é uma sequência de erosão seguida de dilatação, ambos usando o mesmo Sel. Tem a propriedade chamada idempotence. Isso significa que se você fizer uma segunda abertura, não há mudança após a primeira. As operações que são idempotentes têm um significado especial. A abertura pode ser visualizada da seguinte forma: dá-lhe apenas os ON pixels onde o Sel pode caber inteiramente no primeiro plano. (A erosão deu somente em pixels na localização de Origem de Sel de tal padrão de correspondência. Então, ao dilatar esses pixels, com o mesmo Sel. Você obtém todos os pixels na partida.) Então, a abertura projeta um subconjunto de pixels do Imagem de origem e uma segunda abertura dá o mesmo resultado porque o Sel se adapta a esses pixels por construção. O fechamento. Que é uma dilatação seguida por uma erosão com o mesmo Sel. Também é idempotente. É o dupla para a abertura, porque você pode fechar abrindo o plano de fundo. Independentemente da convenção que é usada para definir erosão e dilatação, as operações de abertura e fechamento têm uma definição única. Todas as quatro operações morfológicas têm duas propriedades importantes: invariância de tradução. A operação troca com a tradução: se você traduz a origem e executar uma operação, você obtém o mesmo resultado que se você realizasse a operação primeiro e depois traduzisse o resultado. Aumentando. Se você tem duas imagens, uma das quais tem um primeiro plano completamente contido no outro, os resultados de uma operação morfológica mantêm a mesma ordem de inclusão. Ao contrário da dilatação e erosão, o resultado de abrir ou fechar uma imagem não depende da localização da origem do Sel. (Esta é outra razão para inverter o Sel para a erosão.) Uma conseqüência disso é que a abertura e o fechamento possuem propriedades especiais além da idempotência não compartilhada por erosão e dilatação. Ou seja, a abertura é anti-extensiva. O que significa que o conjunto de ON pixels após a abertura está contido na imagem de origem. Oposto, o fechamento é extenso porque a imagem de origem ON pixels está toda contida na imagem que resulta do fechamento dela. A erosão e a dilatação não possuem essas propriedades porque o resultado depende da localização da origem Sel. Por exemplo, se você dilatar uma imagem com um Sel que tenha um único deslocamento de sucesso da origem Sel, o resultado é simplesmente uma tradução da imagem original pelo vetor da origem Sel para esse hit. Para este caso, são os pixels de origem ON todos contidos nos pixels de ON do destino E há mais em morfologia do que invariantes de tradução, aumentando as primitivas. Você pode pensar que todas as operações importantes são invariantes de tradutor, mas isso não é verdade. Por exemplo, qualquer operação que dimensiona o tamanho da imagem não é invariante de tradução. Por exemplo, se uma imagem é reduzida por subamostragem, a imagem resultante depende da grade de subamostragem (isto é, nos pixels específicos que são escolhidos para representar a imagem reduzida). Uma tradução da imagem relativa a esta grade antes da submissão pode resultar em uma imagem diferente (traduzida) da produzida pela subamostragem na localização da grade original. Há outra operação morfológica importante, a operação de sucesso. É uma combinação de padrões muito geral porque encontra correspondências a partes da imagem que especificaram pixels OFF, bem como ON pixels. Por exemplo, a borda inferior de uma linha horizontal na imagem pode ser encontrada com um sucesso Mark que tem uma linha de falhas abaixo de uma linha de sucessos. Para que um pixel seja ativado no destino, todos os hits devem estar em ON pixels e todas as falhas devem estar em OFF pixels na fonte. (A operação às vezes é chamada de hit-or-miss, mas a operação é realmente um hit-and - miss). Assim, na sua forma mais geral, o Sel tem em cada local um sucesso, uma falta ou um não-cuidado. A adição de misses ao Sel torna a operação bem-sucedida muito útil, mas perde a crescente propriedade. (Você pode ver por que). Consequentemente, não é de grande interesse na teoria dos conjuntos porque, sem uma preservação do pedido de imagem, podem ser feitas poucas afirmações gerais. Eu não deveria deixar você com a impressão de que isso é tudo que existe para a morfologia binária. Existem muitas outras operações de imagem, como o desbaste (com ou sem preservação de conectividade), que podem ser formadas por seqüências de operações básicas. Há também muitas transformações não-lineares de imagens binárias a grayscale, como uma simples transformação de distância que rotula a distância mínima de cada pixel para um pixel de cor oposta. Uma função não-linear mais complicada rotula componentes conectados (um conjunto de pixels da mesma cor para o qual cada pixel no conjunto é adjacente, em uma orientação de 4 ou 8 conexões, para outro pixel no conjunto), calculando uma medida de Seu comprimento como o máximo, sobre todos os pares de pixels no conjunto, da distância mínima entre os dois pixels, assumindo todos os caminhos entre eles que ficam inteiramente dentro do conjunto de pixels que constituem o componente conectado. Além disso, todas as operações morfológicas binárias podem ser generalizadas para escala de cinza, onde a dilatação é uma operação máxima e a erosão é uma operação de Min. (Você vê como a dilatação e a erosão binária são um caso especial de tomar a operação Max e Min. Com uma imagem binária, o valor máximo é 1 eo valor min é 0. Uma erosão coloca um valor de 0 na origem Sel, a menos que Todos os pixels sob o Sel são 1. Portanto, a erosão seleciona o mínimo dos valores do pixel binário.) E, uma vez que você escala a escala de cinza, explode o número de operações não-lineares interessantes. Por exemplo, muito trabalho foi feito na segmentação de imagens, geralmente usando sementes e região crescendo. Veja a literatura para obter detalhes. E sobre as condições de contorno Por que uma seção inteira sobre condições de fronteira Por que não simplesmente adotar uma definição matemática elegante e usá-la. Para imagens naturais, onde não há uma polarização a priori em relação a qualquer valor de escala de cinza em particular para pixels além da imagem apropriada, esta é uma abordagem perfeitamente razoável. Para imagens de documentos, no entanto, isso pode dar resultados inesperados. Qual é a definição matematicamente elegante. É aquele que trata a erosão e a dilatação como duais, mesmo na presença de limites. Chamamos isso de condição de limite simétrico (SBC): estenda uma imagem pelo valor min (0 para imagens binárias) para dilatação e pelo valor máximo (1 para imagens binárias) para erosão. Isso dá uma dualidade rigorosa. Para evitar a confusão, chamamos os pixels extras que são usados ​​para estender a imagem para além dos limites reais dos pixels do quadro. No entanto, para imagens de documentos, existe uma polarização natural para ampliar a imagem com pixels de fundo (0, OFF), tanto para dilatação quanto para erosão, porque geralmente temos pixels de fundo nos limites. Então, podemos querer lidar com as condições de contorno, exigindo que obtenhamos o mesmo resultado que se a imagem fosse realmente ampliada o suficiente por 0 pixels, para todas as operações morfológicas. Isso não dá uma dualidade estrita entre dilatação e erosão, mas acho preferível as aplicações de imagens de documentos. Chamaremos isso de condição de fronteira assimétrica (ABC). A erosão é, portanto, diferente para SBC e ABC. Suponha que você tenha uma imagem binária com todos os pixels ON. Uma erosão com um Sol 3x3 virou uma margem larga de 1 pixel em torno da imagem para DESLIGAR usando o ABC, e não tem efeito sobre a imagem usando o SBC. A operação mais problemática em imagens de documentos está sendo fechada. Considere um aplicativo de criação de imagens de documentos com imagens binárias e faça um exemplo de fechamento específico. Suponha que você tenha uma imagem com um pixel ON, localizado perto do limite esquerdo em (x5, y50), em uma imagem de tamanho 100 x 100, e você se dilata com um elemento estruturante horizontal de largura 21 pixels com a origem no centro . Aqui estão os três casos: Fechamento usando convenção de condição de limite assimétrica sem pixels de borda adicionados. A dilatação pára no limite da imagem e você obtém apenas uma linha de 16 ON pixels (5 para o limite, o pixel original e 10 à direita do pixel original). A erosão subsequente com um Sel de 21 pixels de tamanho remove-o completamente, porque não há local em que todos os 21 pixels do Sel sejam cobertos por pixels ON. A remoção do pixel original não é normalmente o que você deseja para uma operação de fechamento. Fechamento usando B. c. assimétrico. Com pixels de borda OFF adicionais. A dilatação expande o pixel orignal para uma linha de comprimento 21 que inclui 5 pixels de moldura e a erosão subsequente deixa um único pixel, o mesmo com o qual você começou. Fechamento usando um simétrico b. c. . Como veremos, isso pode ser implementado sem nenhum pixel de quadro real sendo adicionado. Mas para fins de visualização, imagine que há uma moldura de pixels OFF para a dilatação, que expande o pixel original em uma linha de 21 pixels de comprimento, incluindo 5 no quadro. Em seguida, mude os pixels do quadro para ON e realize a erosão. Como agora há um número infinito de pixels ON no quadro, a erosão apenas remove os 10 pixels à direita do pixel original. O pixel original e os cinco pixels à esquerda permanecem ON. (Lembre-se, a erosão deixa a origem Sel ON se todos os hits no Sel forem cobertos por ON pixels.) Então, obtemos três resultados diferentes. O terceiro resultado, onde os pixels podem ser conectados com o limite pelo fechamento, é o corretamente matematicamente Em termos de dualidade rigorosa (SBC), mas para imagens de documentos, realmente queremos que a operação de fechamento reduza as lacunas dos pixels da imagem para o limite. O primeiro resultado perde o pixel original, o que provavelmente também não será desejável. Somente o segundo resultado nos dá uma imagem que parece intuitivamente correta para uma situação em que a imagem parece naturalmente ser estendida por pixels OFF porque os pixels do primeiro plano são assumidos como localizados na imagem real (sem quadro). Observe que o segundo resultado é independente da localização do limite de imagem real. Este é o motivo que considerava as condições de fronteira com algum detalhe: prefiro ABC para imagens de documentos. Na Leptonica, você escolhe a convenção - ABC ou SBC - que deseja usar. Existe uma função, resetMorphBoundaryCondition (). Que leva um dos dois valores, SYMMETRICMORPHBC e ASYMMETRICMORPHBC. Inicializamos-lo para ABC, de modo que, por padrão, todos os pixels fora da imagem supõem ser 0 (OFF) para dilatação e erosão. As desvantagens desta convenção são que perdemos a dualidade perto do limite e devemos ter cuidado com o fechamento. No entanto, ganhamos a condição de que uma erosão não possa trazer ON pixels do limite para uma imagem que esteja principalmente OFF perto do limite, como a maioria das páginas binárias de imagens do documento são. Se você fizer uma tradução (que pode ser implementada como uma dilatação ou uma erosão por um Sel com um hit que não está no centro de Sel), e você não quer introduzir um retângulo de pixels pretos, você deve usar a convenção de que A imagem é cercada por pixels OFF. Se você usa o SBC com essa tradução, você apresentará um retângulo de pixels ON em uma erosão, mas não em uma dilatação. Como você pode ver, o tipo de condições de limite que você deseja usar pode depender da sua aplicação. A maioria dos matemáticos provavelmente argumentaria em usar o SBC. No entanto, essas questões são apresentadas aqui porque a SBC não é a única escolha possível, e com a Leptonica você pode decidir quais as condições de fronteira que deseja usar. Discutimos abaixo exatamente como lidamos com as condições de fronteira. Acontece que não há essencialmente nenhuma diferença na complexidade ou eficiência de implementação entre as duas opções, para qualquer uma das duas implementações que damos aqui. Essas implementações são discutidas abaixo: rasterops de página completa e acumulação de palavras de destino. A implementação rasterop de morfologia binária Um rasterop geral é uma operação de imagem que combina um retângulo de pixels da imagem de origem com um retângulo de pixels na imagem de destino, onde a operação de combinação pode ser qualquer uma das 12 operações de binário lógico em pixels. Há também casos especiais de rasteros unários que só afetam um retângulo dentro da imagem de destino. Veja a página em rasterops para obter detalhes. Conforme descrito na seção anterior, uma operação morfológica pode ser implementada executando uma seqüência de OR lógicos (para a dilatação) ou ANDs lógicos (para a erosão) da imagem de origem, traduzida de cada vez de acordo com um dos hits no Sel . O rasterop pode ser usado, onde o retângulo escolhido é toda a imagem de origem. Para todos os rasterops, a imagem de origem é cortada para que não tente escrever além de qualquer limite do destino. Há outros detalhes, é claro, como as condições iniciais na imagem de destino e o tratamento das condições de contorno. Já apresentamos a questão das diferentes convenções para escolher condições de fronteira para a erosão. Podemos imaginar implementar a erosão por rasterops de duas maneiras: Comece com uma imagem de destino que é apagada (todos os pixels têm valor 0). Copie a imagem de origem para ela com um deslocamento dado por (um arbitrário) um dos hits no Sel. Por simplicidade, imagine que esta cópia é feita sem qualquer mudança porque o primeiro hit no Sel está na origem Sel. O resto dos sucessos resulta em um AND da fonte deslocada e recortada com o destino. Comece com uma imagem de destino onde todos os pixels estão configurados para um valor 1. Para cada hit no Sel. E a fonte deslocada com o dest. Como inicializamos para 1, você pode usar uma operação de cópia ou AND para o primeiro hit. Isso é duplo para a implementação da dilatação, onde inicializamos todos os pixels para 0 e fazemos uma seqüência de ORs para cada hit no Sel. Usamos o segundo método por causa de sua simplicidade, e porque ele pode ser usado diretamente para implementar erosão com SBC e ABC. Agora, quando uma imagem é deslocada para a direita por 2 pixels, as duas colunas de pixels mais à esquerda no destino não são afetadas pelo AND. O que deve acontecer com essas 2 colunas Depende se você está usando o SBC, que traz logicamente ON pixels do quadro, ou ABC, que traz logicamente os pixels OFF do quadro. (Mas, se fizermos rasterops de imagens completas sem um quadro, nada é realmente trazido - as 2 colunas de pixels simplesmente não são alteradas.) Se você estiver usando o SBC e inicializar os pixels da imagem para ON, essas 2 colunas permanecem ON, apenas Como se você realmente puxou os pixels do quadro. Se você estiver usando o ABC, independentemente do conteúdo da imagem, você deve limpar essas colunas mais tarde. Suponhamos que estamos usando condições de fronteira assimétricas, onde exigimos que o resultado da erosão usando rasterops é equivalente a uma situação em que a fonte é cercada por pixels OFF baixos para cobrir o destino para cada tradução especificada pelo Sel. Detalhes sobre esta escolha de convenção de condição de limite podem ser encontrados em um artigo recente sobre a Eficiência de Implementação de Morfologia Binária. Temos dois métodos para garantir que os pixels próximos ao limite sejam devidamente limpos. Podemos estender a imagem de origem com pixels OFF ao redor e grampear cada rasterop na imagem de destino. Em seguida, aquelas colunas de PÍROS OFF desligariam automaticamente o destino por causa da operação AND. Ou, de forma equivalente, sem incorporar a imagem de origem em uma imagem maior de pixels OFF, podemos executar todos os rasterops na erosão com o recorte usual para a imagem de origem traduzida e, como etapa final, limpe (até) quatro retângulos da Pixels de limite apropriados no destino. Para cada um desses retângulos, o tamanho em uma direção normal ao limite é igual ao deslocamento máximo (em relação à origem Sel) na correspondente das quatro direções. Por exemplo, se a mudança máxima para a direita no Sel for 4 pixels, o retângulo que consiste nas 4 colunas mais à esquerda do destino deve ser limpo. (Lembre-se de que, para a erosão, o vetor que dá o deslocamento da imagem para cada golpe no Sel é do local de sucesso para a origem de Sel.) Devemos também limpar os pixels de borda para a transformada hit-miss, porque é um parente próximo de A erosão. O tamanho dos retângulos a serem limpos é determinado a partir dos sucessos no Sel. Exatamente como na erosão. A localização das falhas no Sel não é importante para a operação de limpeza porque os pixels que seriam trazidos de além do limite da imagem (se estivessem estendidos) estariam em ON. Isso ocorre porque, para cada falta, uma versão traduzida da imagem negativa é ANDed. Suponha, pelo contrário, que você adote as condições de fronteira simétricas, a saber, que a imagem está cercada de ON pixels para uma erosão, conforme discutido acima. Então você simplesmente usa o segundo método para a erosão indicada acima: configure os pixels de imagem de destino (para 1), então, e cada operação de quadriculação, corretamente deslocada e cortada. Esta operação é dupla para a dilatação, e você pára por aí - você não limpa os pixels da borda. Para o fechamento, com o exemplo dado na seção anterior, não precisamos adicionar pixels de quadro circundantes para a implementação do rasterop. Após a dilatação, colocamos todos os pixels de destino em ON para a erosão e faz o conjunto de ANDs da fonte (que é o destino da dilatação anterior). Devido ao recorte de rasterop, é fácil ver que a linha de pixels do limite original para a esquerda será preservada pela erosão. Conforme mencionado na seção anterior, você pode determinar as condições de contorno usando a função resetMorphBoundaryCondition (). Os efeitos do limite são mais marcantes com a operação de fechamento. O fechamento é formalmente extenso, mas com a convenção ABC sem pixels de quadros adicionados, ON pixels perto do limite da imagem podem ser removidos porque a dilatação não se estende além do limite. Se você estiver usando a convenção ABC, a função pixCloseSafe () removerá essa anomalia adicionando uma moldura de tamanho mínimo necessário para cada imagem antes de fechar e removendo os pixels do quadro no final. As rotinas para adicionar e remover uma dessas estruturas estão em pix2.c. (Na libarária, nos referimos a isso como adição ou remoção de uma borda). Note novamente que, se você estiver usando o SBC, o fechamento será extenso sem a adição de pixels reais ao redor do limite, e a anomalia será evitada automaticamente. O código-fonte para a implementação do rasterop da morfologia binária está em morph. c. Algumas coisas a serem observadas são: argumentos de chamada. A dilatação é típica: o primeiro argumento é o dest, se for NULL, um novo destino é atribuído. A função retorna o dest em todas as circunstâncias. Se pixs e pixd são ponteiros para a mesma Pix. A operação está no local, e os pixs serão alterados de outra forma, os pixs são inalterados. Definições da estrutura de dados. O Sel é definido em morph. h e o Pix é definido em pix. h. Todos os campos Pix só devem ser alterados usando os acessadores get e set fornecidos em pix1.c. Construção de sel s. Existem várias funções para criar um Sel. SelCreate () faz um Sel inicializado para entradas não-cuidados. SelCreateBrick () faz com que um Sel seja inicializado para não cuidar, bater ou perder entradas. Os sel s criados podem ser empacotados em uma matriz (Sela) usando selaAddSel () repetidamente. Sel s pode ser extraído de Sela (arrays) por nome usando selaFindSelByName () ou por índice usando selaGetSel (). Sel s pode ser criado a partir de Pix ou uma matriz de pts (um Pta). Sel s pode ser criado a partir de uma string compilada que, quando exibida, mostra os hits, falhas e origem no arranjo geométrico correto. Sel s pode ser criado a partir de um formato de arquivo simples que usa o mesmo formato para a seqüência compilada. Sel s pode ser criado a partir de um pix colorido gerado com um editor de pixmap. Visualização e arquivamento de Sel s. Existem várias maneiras de salvar ou exibir uma matriz Sel ou Sela. Sel s e Sela podem ser escritos em ascii, seja para um fluxo ou para um arquivo (sel1.c). Sel s pode ser escrito para uma string que, quando exibida, mostra os hits, erros e origem no arranjo geométrico correto (sel1.c). Sel s pode ser exibido em um pix binário de uma forma adequada para publicação (selDisplayInPix ()). Uma imagem colorida de um Sel (em geral, um Sel de sucesso) pode ser gerada usando pixDisplayHitMissSel () em selgen. c. A implementação de acumulação de palavras de destino da morfologia binária A acumulação de palavras de destino (dwa) é um método muito mais eficiente de implementar a morfologia binária. Passamos pela imagem de destino uma palavra (32 bits) de cada vez, calculando seu valor com base na imagem de origem e no Sel. E depois escreva essa palavra para a imagem de destino. Isso é mais eficiente do que a versão rasterop porque o loop interno para cada palavra de destino é desenrolado no conjunto mais simples de operações, sem ramificações ou ciclos de iteração. Ao contrário da implementação do rasterop, o dwa requer rotinas especializadas para erosão e dilatação usando cada Sel. No entanto, verá que isso não é um impedimento para sua utilização. As comparações de desempenho entre implementações rasterop e dwa de morfologia binária podem ser encontradas em: um documento ISMM 2002: Eficiência de Implementação de Morfologia Binária (pdf). Um resumo informal desse documento também está disponível em pdf. Para evitar a escrita de funções de casos especiais para palavras que estão em ou perto dos limites da imagem, dwa é implementada em pixels internos que são mais de 32 pixels do limite de imagem real. A borda externa de 32 pixels de pixels dentro da imagem é lida, mas não escrita. Se em uma aplicação desejar operar em todos os pixels da imagem, o usuário deve adicionar uma borda de pixels do quadro antes de fazer uma dilatação ou erosão. Também é necessário adicionar os pixels do quadro com a cor inicial correta. Para dilatação, os pixels adicionados ao destino são sempre 0 (DESLIGADO). Para erosão, eles são OFF para ABC e ON para SBC. Isso poderia ser automatizado se o pix tivesse um campo especificando o tamanho da moldura, mas achei que a adição dessa maquinaria para simplificar um pouco a utilização da morfologia dwa não era justificada. Basta ter em mente que o uso de dwa requer uma borda de pixels de quadro extra se você não quiser obter artefatos de limites e você deve inicializar os pixels adequadamente de acordo com a convenção que você está usando. Interfaces de código dwa geradas automaticamente Nós fornecemos duas implementações que geram automaticamente o código para a morfologia dwa. Sels de Hit-Only. A função fmorphautogen () em fmorphauto. c leva uma Sela. Um número inteiro e um nome de arquivo opcional, e escreve o código C para dilatações, erosões, abertura e fechamento, usando cada um dos Sel s no Sela. The integer is used to give all functions a unique name so that the C code created by multiple invocations of fmorphautogen() using different Sela s will all compile and link together in an application. For example, the program progfmorphautogen makes a Sela of the 58 Sel s that are generated by selaAddBasic() . and generates dwa C code for the four morphological operations for each Sel . It uses the integer 1 to generate the code in two files: fmorphgen.1.c and fmorphgenlow.1.c . We have compiled these files into the library. The functions pixMorphDwa1() and pixFMorphopGen1() in fmorphgen.1.c are then available to be called by any application to perform a morphological operation: The use of the first two arguments is standard, as described above for the rasterop implementation. The operation is one of the set LMORPHDILATE, LMORPHERODE, LMORPHOPEN, LMORPHCLOSE , and the Sel to be used is specified by the name string (the selname) associated with that Sel . The list of allowed name strings for the Sela is automatically extracted and placed in the file fmorphgen.1.c . Hit-miss Sels . The function fhmtautogen() in fhmtauto. c takes a Sela . an integer and an optional filename, and writes the C code for the hit-miss transform, using each of the Sel s in the Sela . The parameter usage is identical to that of the hit-only Sel s. The program progfhmtautogen makes a Sela of the 6 Sel s that are generated by selaAddHitMiss() . and generates dwa C code for the hit-miss transform for each Sel . The code generated by fhmtautogen() with index 1 is in files fhmtgen.1.c and fhmtgenlow.1.c . and has been put in the library. The only restriction beyond size on the hit-miss Sel s is that each one must have at least one hit otherwise, the code generated aborts with an error message. There are several other practical things to note about using the dwa implementations: You must add a border before dwa operations and remove it afterwards . Add a 32 pixel border of frame pixels. For symmetric boundary conditions, initialize the added frame pixels to 0 for dilation and 1 for erosion. For asymmetric boundary conditions, always initialize the added frame pixels to 0. The functions pixAddBorder() and pixRemoveBorder() in pix2.c have been provided for this purpose. Higher-level autogend functions are provided : pixMorphDwa() and pixHMTDwa() automatically add the border and set the border pixels appropriately. pixFMorphopGen() and pixFHMTGen set the border pixels appropriately, but assume that these border pixels exist. If they dont exist, pixels in the proper image will be treated as border pixels. Limit on Sel size . To simplify the code that automatically generates dwa code, the hits in the Sel must not exceed 31 pixels in any direction away from the Sel origin. The autogen code will truncate any Sel thats larger, and the generated code may not compile. This limit means that with a centered Sel origin, the Sel can not be more than 63x63 pixels. This should be sufficient for most applications. Higher-level functions for brick Sel s exit . These are in morphdwa. c . and take care of all the grungy low-level details, including border pixels and their initialization. Two programs that autogen code are provided . Hits-only . The program is progfmorphautogen . Hit-Miss Transform . The program is progfhmtautogen Reserved indices for autogend code We reserve indices 1-9 for code built with either fmorphauto() and fhmtauto(). Hit-only code using indices 1 and 2, and hit-miss code using index 1 has been generated and inserted in the library. It is suggested that you use numbers larger than 9 in your own code to avoid collisions. Autogend code can be linked directly into applications . You have the option to add the code to the library and compile it there, or to compile and link the code directly into an executable. The latter is simpler. Programs are provided for verification of correctness of autogen code . The programs progbinmorphreg . dwamorphreg and fhmtautoreg do a variety of tests on the morphological functions. Most of these compare the dwa and full image rasterop implementations. Note that when a border is added for dilation, the added border pixels must be initialized to 0 for erosion, the value of the border pixels depends on whether you are using the asymmetric or symmetric boundary condition convention. There is more information in the source code . Consult the source for further details on usage. Separable atomic operations with block Sels, Sel decomposition, sequence interpreters and simplicity of use With all the mechanisms set up for doing binary morphology with both rasterop and dwa, and for doing grayscale morphology. it is important to add some machinery to make it very easy to use for the situation where the Sels are linear operators of all HITS, which is by far the most common usage. These linear operators can be used in separable combinations, horizontal and vertical, to implement morphology with 2-dimensional rectangular Sels of all HITS. We call these 2-dimensional Sels bricks. Large linear Sels, of which the bricks are composed, can themselves be decomposed for efficiency, and we do this with 2-way composites, giving a computation savings for a linear Sel of length n of about a factor of n (2 sqrt(n)) over the unary method without decomposition. The machinery has two levels that are convenient for use: a lower level where the brick Sel morphologyical operations are directly invoked, and a higher level that is an interpreter to run a sequence of such operations. Specifically, Atomic functions for brick Sels, using separability and optionally 2-way composition. A set of interpreters to implement a sequence of these atomic functions. Atomic separable functions There are five sets of atomic functions for brick Sels, all with similar interfaces: Grayscale morphological operations (in graymorph. c ). Binary morphology using rasterops (the pixBrick() functions in morph. c ). Binary morphology using rasterops with 2-way Sel composition (the pixCompBrick() functions in morph. c ). Binary morphology using dwa (the pixBrickDwa() functions in morphdwa. c ). Binary morphology using dwa with 2-way Sel composition (the pixCompBrickDwa() functions in morphdwa. c ). These all take the sizes of the horizontal and vertical dimensions of the structuring element, and do separable implementions when both dimensions are greater than 1. They are useful in their own right because they implement correct boundary conditions, including safe closing if chosen. They also handle all intermediate images transparently, of which there are several for separable openings and closings. And they dont require the generation and destruction of Sels, as they make them internally and destroy them after use. See the notes at the beginning of morph. c for usage. For the operations using 2-way composable Sels, consider pixOpenCompBrick() as an example. The results are identical to to the those of pixOpenBrick() . for sizes that are exactly decomposed such that the product of factors in the former equals the Sel size of the latter. We place constraints and penalties on the functions that choose how to do the decomposition. The regression test progbinmorph2reg. c demonstrates the result of decomposition. For large Sels, the pixCompBrick() functions are much more efficient. progbinmorph2reg also tests the dwa composable Sel operations, such as pixOpenCompBrickDwa() . The dwa brick morphological operations work on the set of linear Sels that are generated by selaAddBasic() . and which are implemented in dwa by the functions in fmorphgen.1.c . Look there to see which are available. If for some reason you want some other Sel, such as sel23h, which is not there, you can follow one of the prescriptions set out in morphdwa. c . However, you will likely find that you dont need to do this, because the dwa operations that use 2-way composable Sels will implement a close approximation to sel23h. For convenience, if you call the non-composite dwa version, such as pixCloseBrickDwa() . and the Sel doesnt exist for it, it will automatically call the 2-way composite dwa version, pixCloseCompBrickDwa() . Interpreters for sequences of atomic operations To make these atomic functions even simpler to use, we provide interpreters for sequences of morphological operations. For binary morphology, these sequences are combined with rank reductions and replicative expansion. All the interpreters are in morphseq. c . The morphological operations enabled by the sequences all use separable brick Sels. As with the atomic brick dwa functions, the interpreters reduce the complexity of using a dwa implementation to s single function invocation with a simple interface. How do we test all this A large regression test, progbinmorph1reg. c . tests all the binary brick operations, including the 2-way Sel decomposition, along with their interpreted sequences. Specifically, we test all morphological operations using: general rasterop brick rasterop (unary Sel) morph sequence of brick rasterop (unary Sel) morph sequence of composite brick rasterop brick dwa morph sequence of brick dwa morph sequence of composite brick dwa A second regression test, progbinmorph2reg. c . compares the results of the 2-way composite separable brick implementations (both rasterop and dwa) against the unary brick implementations. A third regression test, progbinmorph3reg. c . compares rasterop brick (separable and non-separable) with various implementations of separable dwa bricks. Our default boundary condition is asymmetric (0 for both dilation and erosion), but you can toggle this to test all functions with using the symmetric b. c. as well. Summary of available implementations A summary might help describe all these different implementations, and how they are used. The top-level for all these is in morph. c (full image rasterops) and morphdwa. c (destination word accumulation -- dwa). Full image rasterops Full image rasterops works with any arbitrary Sel (including, of course, hit-miss Sels). Consider dilating an image with a 40 x 40 brick Sel. pixDilate() will require 1600 full page rasterops, Brute force. The next level up in complexity are the brick rasterops, which are separable. pixDilateBrick() will carry out the 40 x 40 dilation with a mere 80 rasterops. Next up in complexity are the two-way decomposable brick rasterops. These use two Sels, a linear Sel and a comb Sel. pixDilateCompBrick will perform the 40 x 40 dilation using a linear brick of length 8 and a 5-tine comb in each direction, for a total of 26 rasterops. Separability and decomposability are important for large Sels Destination word accumulation Dwa implementations are typically about 3-5 times faster than full image rasterops. The implementation is perhaps more complicated, but no harder to use for the brick Sels. A general Dwa operation on an Sel of all hits or hits and misses can be made using the function fmorphautogen() or fhmtautogen() . respectivamente. These functions take an array of Sels (a Sela), and generate all the code required for any of the four basic morphological operations. Two interfaces are given: a higher one that adds and removes border pixels to avoid boundary effects, and a lower one that assumes the border pixels already exist. The first is useful for simple operations the second for sequences where you dont want to be adding and removing borders multiple times. Once generated, the code can be compiled directly with an program that uses it, or it can be compiled into the library. Sua escolha. Special functions, such as pixDilateBrickDwa() . have been written for Dwa operations using separable brick Sels. Only a small number of linear Sels have been compiled in. However, for operations where the Sel doesnt exist, the brick Dwa operation defaults to the composite one (next). Composite separable functions, such as pixDilateCompBrickDwa() . have been written for all brick Sels up to 63 x 63. (Remember: a Dwa Sel cannot have hits or misses more than 31 pixels on any side of the Sel origin, so putting the origin in the Sel center, this gives a maximum linear Sel size of 63.) Composable brick operations require a sequential operation using a small linear brick and and extended comb the order does not matter. The characteristics of each are given in a struct in sel1.c . The identical combinations are used in the full image rasterop implementation, which is slower than the Dwa but has the ability to go to arbitrary sizes. As you can see, much of the machinery is specifically targeted for brick Sels. The reason is that in most applications, the vast majority of morphological operations use brick Sels There are a set of 3 regression tests, progdwamorphreg. c . that show you how to generate and use new Sels. progdwamorph1reg. c calls a function to generate all linear Sels (both horizontal and vertical) from lengths between 2 and 63. This is a lot of code to add to the library, so instead, it compiles and runs two other programs with the code linked in. These programs are: progdwamorph2reg . This runs a regression test comparing dwa to rasterop morphology for all the basic operations and all 122 Sels. progdwamorph3reg . This runs timing for linear and composable operations for both rasterop and dwa, for all the horizontal Sels. The results are shown at the end of this section. Sequence interpreters As mentioned above, we supply a number of interpreters in morphseq. c for carrying out these brick operations. The interpreters allow you to do a sequence of operations with a single command. They handle all intermediate images in the pipeline, simplifying the usage and avoiding errors in generating, using and destroying the intermediate images. We have interpreters for: Rasterops on separable bricks. These are run using pixMorphSequence() . Rasterops on composable separable bricks. These are run using pixMorphCompSequence() . Dwa on separable bricks. These are run using pixMorphSequenceDwa() . Dwa on composable separable bricks. These are run using pixMorphCompSequenceDwa() . Performance comparisons Performance of linear and composite operations for rasterops and dwa are given in the four plots below. The time for each is given in milliseconds for operations on an image (feyn. tif), which has about 8 million pixels (300 ppi scan on letter size paper). The operations are done on horizontal brick Sels of lengths between 2 and 63. (Operations on vertical brick Sels are considerably faster for rasterop, but only slightly faster for dwa.) This data was generated directly by progdwamorph3reg on a 3 GHz P4, and should be representative for those machines. There are several things to notice: The composite morphological operation times scales approximately as the square root of the Sel size. The dilation starts above the others because it is necessary to add a border for dilation to avoid boundary effects. The speed of dwa is typically about 4 times faster than full image rasterops. The time to do a dwa operation can be estimated from the fact that dwa performs about 12 pixel operations for each machine cycle. For example, a linear erosion of size 60 on a 8 x 106 pixel image reuires about 5 x 108 pixel operations. A 3 GHz machine can perform about 4 x 1010 pixel operationssec, so the erosion should take about 13 msec. The comparable composite operation (6 10 60) is expected to take about 4 msec. As you can see from the plot, there is an additional 2 msec overhead for adding and removing a border, so the composite dwa erosion takes about 6 msec, and the opening and closing require an additional 4 msec (total: 10 msec). In summary, for the fastest operations on brick Sels, use the dwa composite for sizes less than 64 and the rasterop composite for larger ones. Binary morphology and cellular automata I cant leave this subject without mentioning cellular automata (CAs). Conways Game of Life is an example of a cellular automaton (CA). In each generation (or iteration), a set of rules is applied to a binary image to generate another image. Conway used a very simple set of rules, where the value of a pixel on the next iteration depends only on the number of ON pixels adjacent to it. Too few neighboring ON pixels (starvation) or too many (overpopulation) caused the pixel to be OFF (die) in the next iteration. The result was a complicated and unexpected evolution of patterns. Now I find it interesting that people only seem to use 2-D CAs. Not much happens in 1-D. Using a 3-neighborhood consisting of the binary pixel and its two neighbors in 1-D, you can have 2 3 8 different patterns, each of which can have a rule that sets the new pixel value to either ON or OFF. Thus, you can have 2 8 256 different sets of rules for how each pixel changes in the next iteration. A large number, but certainly manageable. But in 2-D, if your rule depends on the 3-neighbors, you can have 2 9 512 different patterns, leading to 2 512 different sets of rules. Thats a very large set, much too large to be usefully explored at random. With such large numbers, it is easy to see that people might be impressed with the computational power. And the numbers continue to explode in higher dimensions. For example, in 3-D, with a 3-neighborhood you have 2 27 patterns, and approximately 2 130000000 different rule sets I havent seen anything done in 3-D, though I imagine it would be much more interesting than 2-D, though much harder to show visually what is happening. For amusement, you can see some interesting 2-D CA at this web site. Each CA is described by its rule, which enumerates the output pixel result for each possible combination of neighbor pixels. There is a simple relation between 2-D CAs and binary morphology. The hit-miss operation is a rule that gives a single pattern of ON and OFF pixels to be matched at each location, with the result that if the pattern is matched the output value is ON, and otherwise it is OFF. Any cellular automaton can thus be built as a generalization of the hit-miss operation, where in general more than one pattern is checked for a match . So in computational power, the hit-miss operation (thus generalized) is equivalent to the cellular automaton Things get even more interesting. Alan Turings fundamental discovery was that all programmed computers are equivalent to a very simple Turing Machine that could read and write binary data on an infinitely long tape. Any machine that is equivalent to a Turing Machine is called Turing complete . And it is easily shown that cellular automata are Turing complete. Consequently, the hit-miss operator can be used to implement a Turing Machine In principle, you can compute anything with this generalized hit-miss operator People who have spent a lot of time with CAs tend to become captivated by their power. I believe it is because the 2-D CA have both general computational power and, at the same time, are able to show us the computational evolution directly through our visual system, rather than analytically in some abstract mathematical representation. The laws of physics can be expressed in many ways among them, a local description of fields and their derivatives being the most common. The fields, which can be related to physical measurements, are the solutions to partial differential equations . These are solved on digital computers, typically by discretizing space onto a lattice and time into discrete increments, as a set of difference equations . A very simple example is the Laplace equation for the electrostatic potential in some region surrounded by a closed boundary on which the potential values are known everywhere. The solution on the lattice points inside is found by applying, over and over, a very simple rule: replace the value of the potential at each point by the average of the four closest neighboring values . This is a relaxation method eventually the potential at each point arrives at its final value. You can implement this by a CA for 2-D geometries, you can even implement it on a spreadsheet (You may be worried because the world -- and spreadsheet cells -- appear to be described by real numbers instead of binary numbers. Well sweep this objection under the rug by noting that real numbers can be approximated to arbitrary precision by binary numbers, patterns of 0s and 1s.) Because the laws of nature seem to be expressible locally by such very simple rules, people naturally wonder if the entire universe is, at the root, one big CA with some very simple rules. There are two areas of physics in particular that have proven to be very difficult to explain, and that have recently forced physicists to develop new fields of mathematics. One is elementary particles, where things are not understood at the very small scales and mathematical descriptions tend to blow up. The other is in the macroscopic regime where we have particle interactions (e. g. in fluids) leading to complex nonlinear behavior such as turbulence and associated chaotic dynamics. In both cases, people naturally search for a set of simple underlying rules to explain the complex behavior. In particle physics, Wheeler speaks of the quantum foam at the scale of the Planck length . about 10 -33 cm, where space-time itself is strongly perturbed by quantum gravity. Can rules at that tiny scale, perhaps given by a CA on a lattice, lead to the observed phenomenology of particle physics at much larger scales such as 10 -17 cm Likewise, people have observed chaotic behavior arising out of 2-D CAs, along with universal scaling parameters for the phenomena, such as period-doubling in chaos, that arise from very simple dynamical rules for the system evolution. So it is natural to hope that CAs can model and perhaps even explain the most difficult fields of physics. And why stop there What about conscious intelligence, a mystery so slippery and deep that the mind is completely boggled at its contemplation Could we possibly be CAs Edward Fredkin, a physicist at Boston University, has spent much of his career on the search for the rules of the universe based on the assumption that space and time are discrete. A good introduction to his thinking is his 1992 paper, A new cosmogony . In 2002, Stephen Wolfram published his Opus Magnus, A new kind of science . a 1200 page treatise on cellular automata based on unpublished work he did over the past 10 years. Wolfram, who got his PhD in physics from CalTech at age 20, has a history of brilliant work, including founding the company (of his name) that makes Mathematica. Like Julian Schwinger, his motto could well be If you cant join em, beat em, but unlike Schwinger, Wolfram is still in the game. I expect Wolfram to make some important observations in this field.

Comments