Java DIP - Guia rápido

O processamento digital de imagens (DIP) trata da manipulação de imagens digitais usando um computador digital. É um subcampo de sinais e sistemas, mas se concentra principalmente em imagens. O DIP se concentra no desenvolvimento de um sistema de computador capaz de realizar o processamento de uma imagem. A entrada desse sistema é uma imagem digital. O sistema processa a imagem usando algoritmos eficientes e fornece uma imagem como saída.

Java é uma linguagem de programação de alto nível amplamente utilizada no mundo moderno. Ele pode suportar e controlar o processamento de imagem digital de forma eficiente usando várias funções.

A BufferedImageclasse Java é uma subclasse da classe Image. É usado para tratar e manipular os dados da imagem. A BufferedImageé feito de ColorModel de dados de imagem. Todos os BufferedImageobjetos têm uma coordenada de canto superior esquerdo de (0, 0).

Construtores

Esta classe oferece suporte a três tipos de construtores.

O primeiro construtor constrói um novo BufferedImagecom um ColorModel e Raster especificados.

BufferedImage(ColorModel cm, WritableRaster raster, 
boolean isRasterPremultiplied, Hashtable<?,?> properties)

O segundo construtor constrói um BufferedImagede um dos tipos de imagem predefinidos.

BufferedImage(int width, int height, int imageType)

O terceiro construtor constrói um BufferedImagede um dos tipos de imagem predefinidos: TYPE_BYTE_BINARY ou TYPE_BYTE_INDEXED.

BufferedImage(int width, int height, int imageType, IndexColorModel cm)

Sr. Não Método e Descrição
1

copyData(WritableRaster outRaster)

Ele calcula uma região retangular arbitrária do BufferedImagee a copia em um WritableRaster especificado.

2

getColorModel()

Ele retorna um objeto da classe ColorModel de uma imagem.

3

getData()

Ele retorna a imagem como um grande bloco.

4

getData(Rectangle rect)

Ele calcula e retorna uma região arbitrária do BufferedImage.

5

getGraphics()

Este método retorna um Graphics2D, mantém a compatibilidade com versões anteriores.

6

getHeight()

Ele retorna a altura do BufferedImage.

7

getMinX()

Ele retorna a coordenada x mínima disso BufferedImage.

8

getMinY()

Ele retorna a coordenada y mínima disso BufferedImage.

9

getRGB(int x, int y)

Ele retorna um pixel inteiro no modelo de cor RGB padrão (TYPE_INT_ARGB) e espaço de cor sRGB padrão.

10

getType()

Ele retorna o tipo de imagem.

Exemplo

O exemplo a seguir demonstra o uso da BufferedImageclasse java que desenha algum texto na tela usando Graphics Object -

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JPanel {

   public void paint(Graphics g) {
      Image img = createImageWithText();
      g.drawImage(img, 20,20,this);
   }

   private Image createImageWithText() {
      BufferedImage bufferedImage = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
      Graphics g = bufferedImage.getGraphics();

      g.drawString("www.tutorialspoint.com", 20,20);
      g.drawString("www.tutorialspoint.com", 20,40);
      g.drawString("www.tutorialspoint.com", 20,60);
      g.drawString("www.tutorialspoint.com", 20,80);
      g.drawString("www.tutorialspoint.com", 20,100);
      
      return bufferedImage;
   }
   
   public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.getContentPane().add(new Test());

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(200, 200);
      frame.setVisible(true);
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Neste capítulo, veremos como você pode baixar uma imagem da Internet, executar algumas técnicas de processamento de imagem na imagem e, em seguida, enviar novamente a imagem processada para um servidor.

Baixando uma imagem

Para baixar uma imagem de um site, usamos uma classe java chamada URL, que pode ser encontrado em java.netpacote. Sua sintaxe é fornecida abaixo -

String website = "http://tutorialspoint.com";
URL url = new URL(website);

Além do método acima, existem outros métodos disponíveis na URL da classe, conforme descrito brevemente -

Sr. Não. Método e Descrição
1

public String getPath()

Ele retorna o caminho do URL.

2

public String getQuery()

Ele retorna a parte da consulta do URL.

3

public String getAuthority()

Ele retorna a autoridade do URL.

4

public int getPort()

Ele retorna a porta do URL.

5

public int getDefaultPort()

Ele retorna a porta padrão para o protocolo da URL.

6

public String getProtocol()

Ele retorna o protocolo da URL.

7

public String getHost()

Ele retorna o host do URL.

Exemplo

O exemplo a seguir demonstra o uso da classe Java URL para baixar uma imagem da Internet -

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.net.URL;

public class Download {

   public static void main(String[] args) throws Exception {
   
      try{
         String fileName = "digital_image_processing.jpg";
         String website = "http://tutorialspoint.com/java_dip/images/"+fileName;
         
         System.out.println("Downloading File From: " + website);
         
         URL url = new URL(website);
         InputStream inputStream = url.openStream();
         OutputStream outputStream = new FileOutputStream(fileName);
         byte[] buffer = new byte[2048];
         
         int length = 0;
         
         while ((length = inputStream.read(buffer)) != -1) {
            System.out.println("Buffer Read of length: " + length);
            outputStream.write(buffer, 0, length);
         }
         
         inputStream.close();
         outputStream.close();
         
      } catch(Exception e) {
         System.out.println("Exception: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o dado acima, a seguinte saída é vista.

Ele baixaria a seguinte imagem do servidor.

Carregando uma imagem

Vamos ver como fazer upload de uma imagem para um servidor da web. Convertemos um BufferedImage em uma matriz de bytes para enviá-lo ao servidor.

Usamos classe Java ByteArrayOutputStream, que pode ser encontrado em java.iopacote. Sua sintaxe é fornecida abaixo -

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);

Para converter a imagem em uma matriz de bytes, usamos toByteArray() método de ByteArrayOutputStreamclasse. Sua sintaxe é fornecida abaixo -

byte[] bytes = baos.toByteArray();

Além do método acima, existem outros métodos disponíveis na classe ByteArrayOutputStream conforme descrito brevemente -

Sr. Não. Método e Descrição
1

public void reset()

Este método redefine o número de bytes válidos do fluxo de saída da matriz de bytes para zero, de modo que toda a saída acumulada no fluxo seja descartada.

2

public byte[] toByteArray()

Este método cria uma nova matriz de bytes alocada. Seu tamanho seria o tamanho atual do fluxo de saída e o conteúdo do buffer será copiado para ele. Ele retorna o conteúdo atual do fluxo de saída como uma matriz de bytes.

3

public String toString()

Converte o conteúdo do buffer em uma string. A tradução será feita de acordo com a codificação de caracteres padrão. Ele retorna a String traduzida do conteúdo do buffer.

4

public void write(int w)

Ele grava a matriz especificada no fluxo de saída.

5

public void write(byte []b, int of, int len)

Ele grava um número de bytes a partir do deslocamento até o fluxo.

6

public void writeTo(OutputStream outSt)

Ele grava todo o conteúdo deste Stream no argumento stream especificado.

Exemplo

O exemplo a seguir demonstra ByteArrayOutputStream para fazer upload de uma imagem para o servidor -

Código do cliente

import javax.swing.*;  
import java.net.*; 
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Client{
   public static void main(String args[]) throws Exception{
   
      Socket soc;
      BufferedImage img = null;
      soc=new Socket("localhost",4000);
      System.out.println("Client is running. ");
      
      try {
         System.out.println("Reading image from disk. ");
         img = ImageIO.read(new File("digital_image_processing.jpg"));
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         
         ImageIO.write(img, "jpg", baos);
         baos.flush();
         
         byte[] bytes = baos.toByteArray();
         baos.close();
         
         System.out.println("Sending image to server. ");
         
         OutputStream out = soc.getOutputStream(); 
         DataOutputStream dos = new DataOutputStream(out);
         
         dos.writeInt(bytes.length);
         dos.write(bytes, 0, bytes.length);
         
         System.out.println("Image sent to server. ");

         dos.close();
         out.close();
         
      } catch (Exception e) {
         System.out.println("Exception: " + e.getMessage());
         soc.close();
      }
      soc.close();
   }
}

Código do Servidor

import java.net.*;
import java.io.*;
import java.awt.image.*;

import javax.imageio.*; 
import javax.swing.*; 

class Server {
   public static void main(String  args[]) throws Exception{
      ServerSocket server=null;
      Socket socket;
      server = new ServerSocket(4000);
      System.out.println("Server Waiting for image");

      socket = server.accept();
      System.out.println("Client connected.");
      
      InputStream in = socket.getInputStream();
      DataInputStream dis = new DataInputStream(in);

      int len = dis.readInt();
      System.out.println("Image Size: " + len/1024 + "KB");
      
      byte[] data = new byte[len];
      dis.readFully(data);
      dis.close();
      in.close();

      InputStream ian = new ByteArrayInputStream(data);
      BufferedImage bImage = ImageIO.read(ian);
 
      JFrame f = new JFrame("Server");
      ImageIcon icon = new ImageIcon(bImage);
      JLabel l = new JLabel();
      
      l.setIcon(icon);
      f.add(l);
      f.pack();
      f.setVisible(true);
   }
}

Resultado

Saída do lado do cliente

Quando você executa o código do cliente, a seguinte saída aparece no lado do cliente -

Saída do lado do servidor

Quando você executa o código do servidor, a seguinte saída aparece no lado do servidor -

Depois de receber a imagem, o servidor exibe a imagem conforme mostrado abaixo -

Uma imagem contém uma matriz bidimensional de pixels. Na verdade, é o valor desses pixels que constituem uma imagem. Normalmente, uma imagem pode ser colorida ou em tons de cinza.

Em Java, a classe BufferedImage é usada para lidar com imagens. Você precisa ligargetRGB() método do BufferedImage classe para obter o valor do pixel.

Obtendo valor de pixel

O valor do pixel pode ser recebido usando a seguinte sintaxe -

Color c = new Color(image.getRGB(j, i));

Obtendo Valores RGB

O método getRGB()toma o índice de linha e coluna como parâmetro e retorna o pixel apropriado. No caso de imagem colorida, ele retorna três valores que são (Vermelho, Verde, Azul). Eles podem ser obtidos da seguinte forma -

c.getRed();
c.getGreen();
c.getBlue();

Obtendo largura e altura da imagem

A altura e largura da imagem podem ser obtidas chamando o getWidth() e getHeight()métodos da classe BufferedImage. Sua sintaxe é fornecida abaixo−

int width = image.getWidth();
int height = image.getHeight();

Além desses métodos, há outros métodos com suporte na classe BufferedImage. Eles são descritos resumidamente-

Sr. Não. Método e Descrição
1

copyData(WritableRaster outRaster)

Ele calcula uma região retangular arbitrária de BufferedImage e a copia em um WritableRaster especificado.

2

getColorModel()

Ele retorna ColorModel de uma imagem.

3

getData()

Ele retorna a imagem como um grande bloco.

4

getData(Rectangle rect)

Ele calcula e retorna uma região arbitrária da BufferedImage.

5

getGraphics()

Este método retorna um Graphics2D, mas está aqui para compatibilidade com versões anteriores.

6

getHeight()

Ele retorna a altura do BufferedImage.

7

getMinX()

Ele retorna a coordenada x mínima deste BufferedImage.

8

getMinY()

Ele retorna a coordenada y mínima deste BufferedImage.

9

getRGB(int x, int y)

Ele retorna um pixel inteiro no modelo de cor RGB padrão (TYPE_INT_ARGB) e espaço de cor sRGB padrão.

10

getType()

Ele retorna o tipo de imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe java BufferedImage que exibe pixels de uma imagem de tamanho (100 x 100) -

import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

class Pixel {
   BufferedImage image;
   int width;
   int height;
   
   public Pixel() {
      try {
         File input = new File("blackandwhite.jpg");
         image = ImageIO.read(input);
         width = image.getWidth();
         height = image.getHeight();
         
         int count = 0;
         
         for(int i=0; i<height; i++) {
         
            for(int j=0; j<width; j++) {
            
               count++;
               Color c = new Color(image.getRGB(j, i));
               System.out.println("S.No: " + count + " Red: " + c.getRed() +"  Green: " + c.getGreen() + " Blue: " + c.getBlue());
            }
         }

      } catch (Exception e) {}
   }
   
   static public void main(String args[]) throws Exception {
      Pixel obj = new Pixel();
   }
}

Resultado

Quando você executa o exemplo acima, ele imprime os pixels da imagem a seguir -

Original Image

Pixels Output

Se você rolar a saída, o seguinte padrão é visto -

Para converter uma imagem colorida em uma imagem em tons de cinza, você precisa ler os pixels ou dados da imagem usando File e ImageIO objetos e armazenar a imagem em BufferedImageobjeto. Sua sintaxe é fornecida abaixo -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);

Além disso, obtenha o valor do pixel usando o método getRGB()e execute o método GrayScale () nele. O método getRGB () leva o índice de linha e coluna como parâmetro.

Color c = new Color(image.getRGB(j, i));
int red = (c.getRed() * 0.299);
int green =(c.getGreen() * 0.587);
int blue = (c.getBlue() *0.114);

Além desses três métodos, existem outros métodos disponíveis na classe Color, conforme descrito brevemente -

Sr. Não. Método e Descrição
1

brighter()

Ele cria uma nova cor que é uma versão mais brilhante dessa cor.

2

darker()

Isso cria uma nova cor que é uma versão mais escura dessa cor.

3

getAlpha()

Ele retorna o componente alfa no intervalo 0-255.

4

getHSBColor(float h, float s, float b)

Ele cria um objeto Color com base nos valores especificados para o modelo de cores HSB.

5

HSBtoRGB(float hue, float saturation, float brightness)

Ele converte os componentes de uma cor, conforme especificado pelo modelo HSB, em um conjunto equivalente de valores para o modelo RGB padrão.

6

toString()

Ele retorna uma representação de string desta cor.

A última etapa é adicionar todos esses três valores e defini-los novamente com o valor de pixel correspondente. Sua sintaxe é fornecida abaixo -

int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());

Exemplo

O exemplo a seguir demonstra o uso da classe Java BufferedImage que converte uma imagem em tons de cinza -

import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class GrayScale {

   BufferedImage  image;
   int width;
   int height;
   
   public GrayScale() {
   
      try {
         File input = new File("digital_image_processing.jpg");
         image = ImageIO.read(input);
         width = image.getWidth();
         height = image.getHeight();
         
         for(int i=0; i<height; i++) {
         
            for(int j=0; j<width; j++) {
            
               Color c = new Color(image.getRGB(j, i));
               int red = (int)(c.getRed() * 0.299);
               int green = (int)(c.getGreen() * 0.587);
               int blue = (int)(c.getBlue() *0.114);
               Color newColor = new Color(red+green+blue,
               
               red+green+blue,red+green+blue);
               
               image.setRGB(j,i,newColor.getRGB());
            }
         }
         
         File ouptut = new File("grayscale.jpg");
         ImageIO.write(image, "jpg", ouptut);
         
      } catch (Exception e) {}
   }
   
   static public void main(String args[]) throws Exception {
      GrayScale obj = new GrayScale();
   }
}

Resultado

Quando você executa o exemplo dado, ele converte a imagem digital_image_processing.jpg para sua imagem em tons de cinza equivalente e grave-a no disco rígido com o nome grayscale.jpg.

Imagem original

Imagem em tons de cinza

Neste capítulo, aprenda como aumentar o contraste de uma imagem usando a equalização do histograma.

Nós usamos o OpenCV função equalizeHist()método. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.equalizeHist(source, destination);

Os parâmetros são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

Source

É uma imagem de fonte de canal único de 8 bits.

2

Destination

É a imagem de destino.

Além do método equalizeHist (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aumentar o contraste de uma imagem -

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {

   static int width;
   static int height;
   static double alpha = 2;
   static double beta = 50;
   
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("grayscale.jpg", 
         Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Imgproc.equalizeHist(source, destination);
         Highgui.imwrite("contrast.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Imagem de contraste aprimorado

Neste capítulo, aumentamos o brilho de uma imagem multiplicando cada pixel da imagem por um valor alfa e adicionando outro valor beta a ele.

Nós OpenCV função convertToque faz a operação acima automaticamente. Pode ser encontrado emMatpacote. Sua sintaxe é fornecida abaixo -

int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);

Os parâmetros são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

destination

É uma imagem de destino.

2

rtype

É o tipo de matriz de saída desejada, ou melhor, a profundidade, já que o número de canais é igual ao da entrada. se rtype for negativo, a matriz de saída terá o mesmo tipo da entrada.

3

alpha

É um fator de escala opcional.

4

beta

É delta opcional adicionado aos valores em escala.

Além do método convertTo, existem outros métodos fornecidos pela classe Mat. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

adjustROI(int dtop, int dbottom, int dleft, int dright)

Ele ajusta o tamanho e a posição da submatriz na matriz pai.

2

copyTo(Mat m)

Copia a matriz para outra.

3

diag()

Ele extrai uma diagonal de uma matriz ou cria uma matriz diagonal.

4

dot(Mat m)

Ele calcula um produto escalar de dois vetores.

5

reshape(int cn)

Ele muda a forma e / ou o número de canais de uma matriz 2D sem copiar os dados.

6

submat(Range rowRange, Range colRange)

Ele extrai uma submatriz retangular.

Exemplo

O exemplo a seguir demonstra o uso da classe Mat para aumentar o brilho de uma imagem -

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;

public class Main {
   static int width;
   static int height;
   static double alpha = 2;
   static double beta = 50;
   
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source =  Highgui.imread("digital_image_processing.jpg",Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),
         
         source.type());
         source.convertTo(destination, -1, alpha, beta);
         Highgui.imwrite("brightWithAlpha2Beta50.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error:" + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Imagem brilhante aprimorada (alfa = 1 e beta = 50)

Imagem brilhante aprimorada (alfa = 2 e beta = 50)

Neste capítulo, aprendemos a aumentar a nitidez de uma imagem usando o filtro Gaussiano.

Primeiro usamos OpenCV função GaussianBlur. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);

Os parâmetros são descritos resumidamente -

Sr. Não. Parâmetro e Descrição
1

source

É a imagem de origem.

2

destination

É uma imagem de destino.

3

Size

É o tamanho do kernel gaussiano.

4

sigmaX

É o desvio padrão do kernel gaussiano na direção X.

Além disso, usamos OpenCV função addWeightedpara aplicar a marca d'água da imagem à imagem. Pode ser encontrado emCorepacote. Sua sintaxe é fornecida abaixo -

Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);

Os parâmetros desta função são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

src1

É a primeira matriz de entrada.

2

alpha

É o peso dos primeiros elementos da matriz.

3

src2

É a segunda matriz de entrada do mesmo tamanho e número de canal que src1.

4

Beta

É o peso dos segundos elementos da matriz.

5

gamma

É escalar adicionado a cada soma.

6

dst

É uma matriz de saída com o mesmo tamanho e número de canais que as matrizes de entrada.

Além do método GaussianBlur, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc e Core para aplicar nitidez a uma imagem -

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Imgproc.GaussianBlur(source, destination, new Size(0,0), 10);
         Core.addWeighted(source, 1.5, destination, -0.5, 0, destination);
         Highgui.imwrite("sharp.jpg", destination);
      } catch (Exception e) {
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Imagem nítida

Uma imagem pode ser facilmente compactada e armazenada por meio do Java. A compactação de imagem envolve a conversão de uma imagem em jpg e seu armazenamento.

Para compactar uma imagem, lemos a imagem e a convertemos no objeto BufferedImage.

Além disso, obtemos um ImageWriter de getImageWritersByFormatName()método encontrado na classe ImageIO. A partir deste ImageWriter, crie umImageWriteParamobjeto. Sua sintaxe é fornecida abaixo -

Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();

A partir deste objeto ImageWriteParam, você pode definir a compactação chamando esses dois métodos que são setCompressionMode() e setCompressionQuality(). Suas sintaxes são as fornecidas abaixo -

obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);

O método setCompressionMode () leva Mode_EXPLICIT como parâmetro. Alguns dos outros MODOS são descritos resumidamente -

Sr. Não. Modos
1

MODE_DEFAULT

É um valor constante que pode ser passado para métodos para habilitar esse recurso para futuras gravações.

2

MODE_DISABLED

É um valor constante que pode ser passado para métodos para desativar esse recurso para futuras gravações.

3

MODE_EXPLICIT

É um valor constante que pode ser passado para métodos para habilitar esse recurso para futuras gravações.

Além dos métodos de compressão, existem outros métodos fornecidos pela classe ImageWriteParam. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

canOffsetTiles()

Ele retorna verdadeiro se o gravador puder executar lado a lado com deslocamentos de grade diferentes de zero durante a gravação.

2

getBitRate(float quality)

Ele retorna um flutuante indicando uma estimativa do número de bits de dados de saída para cada bit de dados de imagem de entrada no nível de qualidade fornecido.

3

getLocale()

Ele retorna o Locale definido atualmente ou null se apenas um Locale padrão for suportado.

4

isCompressionLossless()

Ele retorna verdadeiro se o tipo de compactação atual fornece compactação sem perdas.

5

unsetCompression()

Ele remove qualquer tipo de compressão anterior e configurações de qualidade.

6

unsetTiling()

Ele remove todos os parâmetros de grade de blocos anteriores especificados por chamadas para setTiling.

Exemplo

O exemplo a seguir demonstra o uso da classe ImageWriteParam para compactar uma imagem -

import java.io.*;
import java.util.*;
import java.awt.image.*;

import javax.imageio.*;
import javax.imageio.stream.ImageOutputStream;

class Compression {

   public static void main(String[] args) throws IOException {
   
      File input = new File("digital_image_processing.jpg");
      BufferedImage image = ImageIO.read(input);

      File compressedImageFile = new File("compress.jpg");
      OutputStream os =new FileOutputStream(compressedImageFile);

      Iterator<ImageWriter>writers =  ImageIO.getImageWritersByFormatName("jpg");
      ImageWriter writer = (ImageWriter) writers.next();

      ImageOutputStream ios = ImageIO.createImageOutputStream(os);
      writer.setOutput(ios);

      ImageWriteParam param = writer.getDefaultWriteParam();
      
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
      param.setCompressionQuality(0.05f);
      writer.write(null, new IIOImage(image, null, null), param);
      
      os.close();
      ios.close();
      writer.dispose();
   }
}

Resultado

Quando você executa o código fornecido, ele compacta a imagem digital_image_processing.jpg à sua imagem compactada equivalente e grava-a no disco rígido com o nome compress.jpg.

Imagem original

Imagem compactada - Fator de qualidade - 0,05

Imagem comprimida - Fator de qualidade - 0,5

Neste capítulo, aprendemos a adicionar diferentes tipos de bordas a uma imagem.

Nós usamos OpenCV função copyMakeBorder. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);

Os parâmetros são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

source

É a imagem de origem.

2

destination

É uma imagem de destino.

3

top

É o comprimento em pixels da borda na parte superior da imagem.

4

bottom

Comprimento em pixels da borda na parte inferior da imagem.

5

left

É o comprimento em pixels da borda à esquerda da imagem.

6

right

É o comprimento em pixels da borda à direita da imagem.

7

borderType

Ele define o tipo de borda. As fronteiras possíveis são BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_CONSTANT etc.

Além do método copyMakeBorder (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para adicionar borda a uma imagem -

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",
         
         Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         int top, bottom, left, right;
         int borderType;

         /// Initialize arguments for the filter
         top = (int) (0.05*source.rows()); 
         bottom = (int) (0.05*source.rows());
         left = (int) (0.05*source.cols()); 
         right = (int) (0.05*source.cols());

         destination = source;
         Imgproc.copyMakeBorder(source, destination, top, bottom, left, right, Imgproc.BORDER_WRAP);
         Highgui.imwrite("borderWrap.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Imagem de borda isolada

Imagem de borda envolvida

Imagem da borda refletida

A pirâmide de imagem nada mais é do que um método para exibir uma imagem de resolução múltipla. A camada inferior é uma versão de resolução mais alta da imagem e a camada superior é uma versão de resolução mais baixa da imagem. Pirâmides de imagens são usadas para lidar com imagens em diferentes escalas.

Neste capítulo, executamos alguns down sampling e up sampling em imagens.

Nós usamos OpenCV funções pyrUp e pyrDown. Eles podem ser encontrados emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);

Os parâmetros são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

source

É a imagem de origem.

2

destination

É a imagem de destino.

3

destinationSize

É o tamanho da imagem de saída. Por padrão, é calculado como Tamanho ((src.cols * 2), (src.rows * 2)).

Além dos métodos pyrUp e pyrDown, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para realizar up sampling e down sampling em uma imagem.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try{
      
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination1 = new Mat(source.rows()*2, source.cols()*2,source.type());
         destination1 = source;
         
         Imgproc.pyrUp(source, destination1, new  Size(source.cols()*2   source.rows()*2));
         Highgui.imwrite("pyrUp.jpg", destination1);
         
         source = Highgui.imread("digital_image_processing.jpg", 
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination = new Mat(source.rows()/2,source.cols()/2, source.type());
         destination = source;
         Imgproc.pyrDown(source, destination, new Size(source.cols()/2,  source.rows()/2));
         Highgui.imwrite("pyrDown.jpg", destination);
         
      } catch (Exception e) { 
         System.out.println("error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Na imagem original, são executados pyrUp (UP Sampling) e pyrDown (Down Sampling). A saída após a amostragem é mostrada abaixo -

Imagem PyrUP

imagem pyrDown

Limiar permite alcançar a segmentação da imagem da maneira mais fácil. Segmentação de imagem significa dividir a imagem completa em um conjunto de pixels de forma que os pixels de cada conjunto tenham algumas características comuns. A segmentação de imagens é muito útil na definição de objetos e seus limites.

Neste capítulo, realizamos algumas operações básicas de limiarização em imagens.

Nós usamos OpenCV função threshold. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.threshold(source, destination, thresh , maxval , type);

Os parâmetros são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

source

É a imagem de origem.

2

destination

É uma imagem de destino.

3

thresh

É o valor limite.

4

maxval

É o valor máximo a ser usado com os tipos de limite THRESH_BINARY e THRESH_BINARY_INV.

5

type

Os tipos possíveis são THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC e THRESH_TOZERO.

Além desses métodos de limite, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para realizar operações de limite para uma imagem -

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try{

         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());

         destination = source;
         Imgproc.threshold(source,destination,127,255,Imgproc.THRESH_TOZERO);
         Highgui.imwrite("ThreshZero.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Na imagem original acima, algumas operações de limiar são realizadas, as quais são mostradas na saída abaixo -

Thresh Binary

Thresh Binary Invert

Limiar Zero

A forma da imagem pode ser facilmente alterada usando OpenCV. A imagem pode ser invertida, dimensionada ou girada em qualquer uma das quatro direções.

Para mudar a forma da imagem, lemos a imagem e a convertemos em objeto Mat. Sua sintaxe é fornecida abaixo -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

Invertendo uma imagem

O OpenCV permite três tipos de flip codes que são descritos abaixo -

Sr. Não. Flip Code & Description
1

0

0 significa girar em torno do eixo x.

2

1

1 significa girar em torno do eixo y.

3

-1

-1 significa inverter em torno de ambos os eixos.

Passamos o código flip apropriado para o método flip() no Coreclasse. Sua sintaxe é fornecida abaixo -

Core.flip(source mat, destination mat1, flip_code);

O método flip() usa três parâmetros - a matriz da imagem de origem, a matriz da imagem de destino e o código de inversão.

Além do método flip, existem outros métodos fornecidos pela classe Core. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

add(Mat src1, Mat src2, Mat dst)

Ele calcula a soma por elemento de duas matrizes ou uma matriz e um escalar.

2

bitwise_and(Mat src1, Mat src2, Mat dst)

Ele calcula a conjunção bit a bit por elemento de duas matrizes ou uma matriz e um escalar.

3

bitwise_not(Mat src, Mat dst)

Ele inverte cada bit de um array.

4

circle(Mat img, Point center, int radius, Scalar color)

Ele desenha um círculo.

5

sumElems(Mat src)

Desfoca uma imagem usando um filtro gaussiano.

6

subtract(Mat src1, Scalar src2, Mat dst, Mat mask)

Ele calcula a diferença por elemento entre dois arrays ou array e um escalar.

Exemplo

O exemplo a seguir demonstra o uso da classe Core para virar uma imagem -

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

import java.io.File;
import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         File input = new File("digital_image_processing.jpg");
         BufferedImage image = ImageIO.read(input);	

         byte[] data = ((DataBufferByte) image.getRaster().  getDataBuffer()).getData();
         Mat mat = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);
         mat.put(0, 0, data);

         Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);
         Core.flip(mat, mat1, -1);

         byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5);
         image1.getRaster().setDataElements(0,0,mat1.cols(),mat1.rows(),data1);

         File ouptut = new File("hsv.jpg");
         ImageIO.write(image1, "jpg", ouptut);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o exemplo acima, ele muda o nome de uma imagem digital_image_processing.jpg para sua imagem de espaço de cor HSV equivalente e gravá-la no disco rígido com o nome flip.jpg.

Imagem original

Imagem invertida

Neste capítulo, aplicamos o filtro Gaussiano a uma imagem que desfoca uma imagem. Vamos usar a função GaussianBlur do OpenCV para aplicar o filtro Gaussiano às imagens. Ele pode ser encontrado no pacote Imgproc. Sua sintaxe é fornecida abaixo -

Imgproc.GaussianBlur(source, destination,Size,SigmaX);

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento e Descrição
1

source

É a imagem de origem.

2

destination

É uma imagem de destino.

3

Size

É o tamanho do kernel gaussiano.

4

SigmaX

É o desvio padrão do kernel gaussiano na direção X.

Além do método GaussianBlur, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o filtro Gaussiano a uma imagem.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class Main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("digital_image_processing.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Imgproc.GaussianBlur(source, destination,new Size(45,45), 0);
         Highgui.imwrite("Gaussian45.jpg", destination);
      
      } catch (Exception e) {
         System.out.println("Error:" + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Quando esta imagem original é convolvida com o filtro Gaussiano de tamanho 11 e 45, a seguinte saída é vista.

Filtro gaussiano de tamanho 11

Filtro gaussiano de tamanho 45

Aplicamos o filtro Box que desfoca uma imagem. Um filtro Box pode ter as dimensões 3x3, 5x5, 9x9 etc.

Nós usamos OpenCV função filter2Dpara aplicar o filtro de caixa às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento e Descrição
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o filtro Box a uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Mat kernel = Mat.ones(kernelSize,kernelSize, CvType.CV_32F);	      
         
         for(int i=0; i<kernel.rows(); i++) {
            for(int j=0; j<kernel.cols(); j++) {
            
               double[] m = kernel.get(i, j);
               
               for(int k =0; k<m.length; k++) {
                  m[k] = m[k]/(kernelSize * kernelSize);
               }
               kernel.put(i,j, m);
            }
         }	   
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Neste exemplo, nós convolvemos nossa imagem com o seguinte filtro (kernel). Este filtro resulta em borrar uma imagem conforme seu tamanho aumenta.

Esta imagem original foi convolvida com o filtro de caixa de tamanho 5, que é dado abaixo -

Filtro de caixa de tamanho 5

25/01 25/01 25/01 25/01 25/01
25/01 25/01 25/01 25/01 25/01
25/01 25/01 25/01 25/01 25/01
25/01 25/01 25/01 25/01 25/01
25/01 25/01 25/01 25/01 25/01

Imagem convolvida (com filtro de caixa de tamanho 5)

Imagem convolvida (com filtro de caixa de tamanho 9)

Neste capítulo, aprendemos a aplicar dois operadores morfológicos muito comuns: Dilatação e Erosão.

Nós usamos OpenCV função erode e dilate. Eles podem ser encontrados emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);

Os parâmetros são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

source

É a imagem de origem.

2

destination

É uma imagem de destino.

3

element

É um elemento estruturante usado para erosão e dilatação, se element = Mat (), um elemento estruturante retangular 3 x 3 é usado.

Além dos métodos erode () e dilate (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para realizar erosão e dilatação em uma imagem -

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try{	
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         destination = source;

         int erosion_size = 5;
         int dilation_size = 5;
         
         Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new  Size(2*erosion_size + 1, 2*erosion_size+1));
         Imgproc.erode(source, destination, element);
         Highgui.imwrite("erosion.jpg", destination);

         source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         
         destination = source;
         
         Mat element1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new  Size(2*dilation_size + 1, 2*dilation_size+1));
         Imgproc.dilate(source, destination, element1);
         Highgui.imwrite("dilation.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error:" + e.getMessage());
      } 
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Na imagem original acima, algumas operações de erosão e dilatação foram realizadas, as quais são mostradas na saída abaixo -

Erosão

Dilatação

Neste capítulo, aprendemos duas maneiras de aplicar marcas d'água em imagens. Essas formas são -

  • Aplicação de marca d'água de texto
  • Aplicando marca d'água de imagem

Aplicação de marca d'água de texto

Nós usamos OpenCV função putTextpara aplicar a marca d'água de texto à imagem. Pode ser encontrado emCorepacote. Sua sintaxe é fornecida abaixo -

Core.putText(source, Text, Point, fontFace ,fontScale , color);

Os parâmetros desta função são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

Source

É a imagem de origem.

2

Text

É o texto da string que apareceria na imagem.

3

Point

É o ponto onde o texto deve aparecer na imagem.

4

fontFace

Tipo de fonte. Por exemplo - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX etc.

5

fontScale

É o fator de escala da fonte que é multiplicado pelo tamanho base específico da fonte.

6

color

É a cor do texto.

Além do método putText, existem outros métodos fornecidos pela classe Core. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

normalize(Mat src, Mat dst, double alpha, double beta, int norm_type)

Ele normaliza a norma ou intervalo de valores de uma matriz.

2

perspectiveTransform(Mat src, Mat dst, Mat m)

Realiza a transformação da matriz de perspectiva de vetores.

3

phase(Mat x, Mat y, Mat angle)

Ele calcula o ângulo de rotação de vetores 2D.

4

rectangle(Mat img, Point pt1, Point pt2, Scalar color)

Ele desenha um retângulo simples, espesso ou preenchido à direita.

5

reduce(Mat src, Mat dst, int dim, int rtype, int dtype)

Ele reduz uma matriz a um vetor.

6

transform(Mat src, Mat dst, Mat m)

Ele realiza a transformação da matriz de cada elemento da matriz.

Exemplo

O exemplo a seguir demonstra o uso da classe Core para aplicar marca d'água de texto a uma imagem -

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(), source.type());  
         
         Core.putText(source, "Tutorialspoint.com", new Point  (source.rows()/2,source.cols()/2), Core.FONT_ITALIC,new Double(1),new  Scalar(255));

         Highgui.imwrite("watermarked.jpg", source);
         
      } catch (Exception e) {
         System.out.println("Error: "+e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Imagem com marca d'água de texto

Aplicação de marca d'água de imagem na imagem

Vamos usar OpenCV função addWeightedpara aplicar a marca d'água da imagem à imagem. Pode ser encontrado emCorepacote. Sua sintaxe é fornecida abaixo -

Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);

Os parâmetros desta função são descritos abaixo -

Sr. Não. Parâmetro e Descrição
1

src1

É a primeira matriz de entrada.

2

alpha

É o peso dos primeiros elementos do array.

3

src2

É a segunda matriz de entrada do mesmo tamanho e número de canal que src1.

4

beta

É o peso dos segundos elementos da matriz.

5

gamma

É o escalar adicionado a cada soma.

6

dst

É a matriz de saída que possui o mesmo tamanho e número de canais que as matrizes de entrada.

Exemplo

O exemplo a seguir demonstra o uso da classe Core para aplicar marca d'água de imagem a uma imagem -

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat waterMark = Highgui.imread("watermark.png",  Highgui.CV_LOAD_IMAGE_COLOR);
         Rect ROI = new Rect(waterMark.rows() * 4,waterMark.cols(),  waterMark.cols(),waterMark.rows());
         
         Core.addWeighted(source.submat(ROI), 0.8, waterMark, 0.2, 1,  source.submat(ROI));
         Highgui.imwrite("watermarkedImage.jpg", source);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

A imagem da marca d'água

Imagem com marca d'água

Convolução é uma operação matemática em duas funções f e g. As funções feg, neste caso, são imagens, já que uma imagem também é uma função bidimensional.

Realizando Convolução

Para realizar a convolução em uma imagem, as seguintes etapas são realizadas -

  • Vire a máscara (horizontalmente e verticalmente) apenas uma vez.
  • Deslize a máscara na imagem.
  • Multiplique os elementos correspondentes e, em seguida, adicione-os.
  • Repita este procedimento até que todos os valores da imagem tenham sido calculados.

Nós usamos OpenCV função filter2Dpara aplicar convolução às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento e Descrição
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para realizar a convolução em uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 3;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,0);
               put(0,1,0);
               put(0,2,0);

               put(1,0,0);
               put(1,1,1);
               put(1,2,0);

               put(2,0,0);
               put(2,1,0);
               put(2,2,0);
            }
         };
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("original.jpg", destination);
         
      } catch (Exception e) {
          System.out.println("Error:" + e.getMessage());
      }
   }
}

Resultado

Neste exemplo, nós convolvemos nossa imagem com o seguinte filtro (kernel). Este filtro resulta na produção da imagem original como ela é -

0 0 0
0 1 0
0 0 0

Imagem original

Imagem Convolvida

O operador Prewitt é usado para detecção de bordas em uma imagem. Ele detecta dois tipos de arestas: arestas verticais e arestas horizontais.

Nós usamos OpenCV função filter2Dpara aplicar o operador Prewitt às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento e Descrição
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o operador Prewitt a uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-1);
               put(0,1,0);
               put(0,2,1);

               put(1,0-1);
               put(1,1,0);
               put(1,2,1);

               put(2,0,-1);
               put(2,1,0);
               put(2,2,1);
            }
         };	 
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Esta imagem original é convolvida com o operador Prewitt de bordas verticais conforme mostrado abaixo -

Direção vertical

-1 0 1
-1 0 1
-1 0 1

Imagem convolvida (direção vertical)

Esta imagem original também foi convolvida com o operador Prewitt de bordas horizontais, que é dado abaixo -

Direção Horizontal

-1 -1 -1
0 0 0
1 1 1

Imagem convolvida (direção horizontal)

O operador Sobel é muito semelhante ao operador Prewitt. Também é uma máscara derivada e é usada para detecção de bordas. O operador Sobel é usado para detectar dois tipos de arestas em uma imagem: Arestas de direção vertical e Arestas de direção horizontal.

Vamos usar OpenCV função filter2Dpara aplicar o operador Sobel às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o operador Sobel a uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-1);
               put(0,1,0);
               put(0,2,1);

               put(1,0-2);
               put(1,1,0);
               put(1,2,2);

               put(2,0,-1);
               put(2,1,0);
               put(2,2,1);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Esta imagem original é convolvida com o operador Sobel de bordas verticais, que é dado abaixo -

Direção vertical

-1 0 1
-2 0 2
-1 0 1

Imagem convolvida (direção vertical)

Este original é convolvido com o operador Sobel de arestas horizontais, que é dado abaixo -

Direção Horizontal

-1 -2 -1
0 0 0
1 2 1

Imagem convolvida (direção horizontal)

As máscaras de bússola Kirsch são outro tipo de máscara derivada que são usadas para detecção de bordas. Este operador também é conhecido como máscara de direção. Neste operador, pegamos uma máscara e a giramos em todas as oito direções da bússola para obter as bordas das oito direções.

Vamos usar OpenCV função filter2Dpara aplicar o operador Kirsch às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o operador Kirsch a uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-3);
               put(0,1,-3);
               put(0,2,-3);
      
               put(1,0-3);
               put(1,1,0);
               put(1,2,-3);

               put(2,0,5);
               put(2,1,5);
               put(2,2,5);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Esta imagem original é convolvida com o operador Kirsch das bordas leste, que conforme mostrado abaixo -

Kirsch East

-3 -3 -3
-3 0 -3
5 5 5

Imagem Convolvida (Kirsch East)

Esta imagem original é convolvida com o operador Kirsch das bordas Sudoeste, que conforme mostrado abaixo -

Kirsch South West

5 5 -3
5 0 -3
-3 -3 -3

Imagem convolvida (Kirsch South West)

As máscaras de bússola Robinson são outro tipo de máscaras derivadas usadas para detecção de bordas. Este operador também é conhecido como máscara de direção. Neste operador, pegamos uma máscara e a giramos em todas as oito direções principais para obter as bordas das oito direções.

Vamos usar OpenCV função filter2Dpara aplicar o operador Robinson às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento e Descrição
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o operador Robinson a uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-1);
               put(0,1,0);
               put(0,2,1);

               put(1,0-2);
               put(1,1,0);
               put(1,2,2);

               put(2,0,-1);
               put(2,1,0);
               put(2,2,1);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Esta imagem original é convolvida com o operador Robinson das bordas norte conforme mostrado abaixo -

Máscara de direção norte

-1 0 1
-2 0 2
-1 0 1

Imagem convolvida (Robinson North)

Esta imagem original também foi convolvida com o operador Robinson das bordas leste, conforme mostrado abaixo -

Máscara de direção leste

-1 -2 -1
0 0 0
1 2 1

Imagem Convolvida (Robinson East)

Operador Laplaciano também é um operador derivado que é usado para localizar bordas em uma imagem. A principal diferença entre o Laplaciano e outros operadores como Prewitt, Sobel, Robinson e Kirsch é que todos são máscaras derivadas de primeira ordem, mas o Laplaciano é uma máscara derivada de segunda ordem.

Nós usamos OpenCV função filter2Dpara aplicar o operador Laplaciano às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumentos
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

depth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o operador Laplaciano a uma imagem em tons de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());

         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,0);
               put(0,1,-1)
               put(0,2,0);

               put(1,0-1);
               put(1,1,4);
               put(1,2,-1);

               put(2,0,0);
               put(2,1,-1);
               put(2,2,0);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Esta imagem original é convolvida com o operador Laplaciano Negativo conforme mostrado abaixo -

Laplaciano negativo

0 -1 0
-1 4 -1
0 -1 0

Imagem convolvida (negativo laplaciano)

Esta imagem original é convolvida com o operador Laplaciano Positivo conforme mostrado abaixo -

Laplaciano positivo

0 1 0
1 -4 1
0 1 0

Imagem Convolvida (Laplaciano Positivo)

No filtro de média ponderada, atribuímos mais peso ao valor do centro, devido ao qual a contribuição do centro passa a ser maior do que o resto dos valores. Devido à filtragem de média ponderada, podemos controlar o desfoque da imagem.

Nós usamos OpenCV função filter2Dpara aplicar o filtro de média ponderada às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Os argumentos da função são descritos abaixo -

Sr. Não. Argumento e Descrição
1

src

É a imagem de origem.

2

dst

É uma imagem de destino.

3

ddepth

É a profundidade do dst. Um valor negativo (como -1) indica que a profundidade é igual à fonte.

4

kernel

É o kernel a ser varrido pela imagem.

5

anchor

É a posição da âncora em relação ao seu núcleo. A localização Ponto (-1, -1) indica o centro por padrão.

6

delta

É um valor a ser adicionado a cada pixel durante a convolução. Por padrão, é 0.

7

BORDER_DEFAULT

Deixamos esse valor por padrão.

Além do método filter2D (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar o filtro de média ponderada a uma imagem de escala de cinza.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = Mat.ones(kernelSize,kernelSize, CvType.CV_32F) {	      
         
         for(int i=0; i<kernel.rows(); i++) {
            for(int j=0; j<kernel.cols(); j++) {

               double[] m = kernel.get(i, j);

               for(int k =0; k<m.length; k++) {

                  if(i==1 && j==1) {
                     m[k] = 10/18;
                  }
                  else{
                     m[k] = m[k]/(18);
                  }
               }
               kernel.put(i,j, m);

               }
            }	
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Esta imagem original é convolvida com o filtro de média ponderada conforme mostrado abaixo -

Filtro de média ponderada

1 1 1
1 10 1
1 1 1

Imagem Convolvida

Zoom é o processo de ampliar uma imagem para que os detalhes da imagem se tornem mais visíveis e proeminentes.

Nós usamos OpenCV função resizepara aplicar zoom às imagens. Pode ser encontrado emImgprocpacote. Sua sintaxe é fornecida abaixo -

Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);

Na função de redimensionamento, passamos a imagem de origem, a imagem de destino e seu tamanho, o fator de zoom e o método de interpolação a ser usado.

Os métodos de interpolação disponíveis são descritos abaixo -

Sr. Não. Método de interpolação e descrição
1

INTER_NEAREST

É a interpolação do vizinho mais próximo.

2

INTER_LINEAR

É uma interpolação bilinear (usada por padrão).

3

INTER_AREA

É uma reamostragem usando a relação de área de pixel. Pode ser um método preferido para dizimação de imagens, pois fornece resultados mais livres.

4

INTER_CUBIC

É uma interpolação bi-cúbica sobre a vizinhança de pixels de 4x4.

5

INTER_LANCZOS4

É uma interpolação de Lanczos sobre a vizinhança de 8x8 pixels.

Além do método de redimensionamento, existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para aplicar zoom a uma imagem.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try {
         int zoomingFactor = 2;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("image.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows() * zoomingFactor, source.cols()*  zoomingFactor,source.type());  
         
         Imgproc.resize(source, destination, destination.size(),  zoomingFactor,zoomingFactor,Imgproc.INTER_NEAREST);
         Highgui.imwrite("zoomed.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: "+e.getMessage());
      }
   }
}

Resultado

Quando você executa o código fornecido, a seguinte saída é vista -

Imagem original

Imagem ampliada (fator de zoom - 2)

Neste capítulo, exploramos algumas das bibliotecas de processamento de imagens gratuitas que são amplamente utilizadas e podem ser facilmente integradas ao projeto. Essas bibliotecas incluem -

  • ImageJ
  • Fiji
  • Commons Imaging
  • ImageMagick
  • Endrov
  • LeadTools
  • OpenCv

ImageJ

ImageJ é um programa de processamento de imagem Java de domínio público inspirado no NIH Image para Macintosh. Ele pode exibir, editar, analisar, processar, salvar e imprimir imagens de 8, 16 e 32 bits.

Alguns dos recursos básicos do ImageJ são descritos abaixo -

Sr. Não. Recurso e descrição
1

Runs Everywhere

ImageJ é escrito em Java, o que permite que seja executado no Linux, Mac OS X e Windows, nos modos de 32 e 64 bits.

2

Open Source

ImageJ e seu código-fonte Java estão disponíveis gratuitamente e são de domínio público.

3

Toolkit

Use ImageJ como um kit de ferramentas de processamento de imagem (biblioteca de classes) para desenvolver applets, servlets ou aplicativos.

4

Data Types

Tons de cinza de 8 bits ou cor indexada, inteiro não assinado de 16 bits, ponto flutuante de 32 bits e cor RGB.

5

File Formats

Abra e salve GIF, JPEG, BMP, PNG, PGM, FITS e ASCII. Abra o DICOM. Abra TIFFs, GIFs, JPEGs, DICOMs e dados brutos usando um URL.

6

Selections

Crie seleções de área retangulares, elípticas ou irregulares. Crie seleções de linha e ponto.

7

Image Enhancement

Suporta suavização, nitidez, detecção de bordas, filtragem mediana e limite em imagens em tons de cinza de 8 bits e em cores RGB.

8

Color Processing

Divida uma imagem colorida de 32 bits em componentes RGB ou HSV. Mescle componentes de 8 bits em uma imagem colorida.

Fiji

Fiji é um pacote de processamento de imagens. Ele pode ser descrito como uma distribuição de ImageJ (e ImageJ2) junto com Java, Java3D e muitos plug-ins organizados em uma estrutura de menu coerente. Fiji se compara ao ImageJ assim como o Ubuntu se compara ao Linux.

Além dos recursos básicos do ImageJ, alguns dos recursos avançados de Fiji são descritos abaixo -

Sr. Não. Recurso e descrição
1

Registering 3D images

Isso envolve alinhamento e montagem elásticos, extração de recursos, estabilizador de imagem etc.

2

Segmenting images

Oferece mais de 35 tipos de segmentação.

3

Useful keyboard short cuts

Fuji tem muitos atalhos de teclado.

4

Scripting

Permitir scripts com macros, em JavaScript, JRuby, Jython, Clojure e Beanshell.

5

Developing Plug-ins

Use o Editor de Script para iniciar o desenvolvimento de plug-ins e, em seguida, execute-os.

6

ImageJ Tricks

ImageJ é fácil de usar, mas às vezes você deseja alguma função que esteja realmente implementada, mas não sabe como acioná-la.

Commons Imaging

Apache Commons Imaging, anteriormente conhecido como Apache Commons Sanselan, é uma biblioteca que lê e grava uma variedade de formatos de imagem, incluindo análise rápida de informações de imagem como (tamanho, cor, espaço, perfil ICC, etc.) e metadados.

Alguns dos recursos básicos do ImageJ são descritos abaixo -

Sr. Não. Recurso e descrição
1

Java

O Apache Commons Imaging é escrito em Java 100% puro. Ele é executado em qualquer JVM e em qualquer plataforma, sem modificação.

2

Image Formats

Ele lê e grava uma ampla variedade de formatos de imagem e suporta algumas variações e codificações perdidas por todas ou a maioria das outras bibliotecas.

3

Metadata support

Ele suporta a leitura e gravação de uma variedade de metadados de forma estruturada, incluindo metadados EXIF.

4

Network Friendly

É compatível com a rede. Commons Imaging lê apenas os dados de que precisa e armazena em cache o que é lido para que não seja muito pesado na rede.

5

Easy to use

Ele é projetado para ser muito fácil de usar. Possui uma interface simples e limpa. A maioria das operações são chamadas de um único método de Imaging.

6

Transparent

O Commons Imaging pretende ser transparente. Não há buffers ocultos para descartar, nenhuma memória nativa para liberar, nem threads em segundo plano.

7

Open Source

É Software Livre / Código Aberto. Ele está disponível sob a licença de software Apache.

8

Color Conversions

A classe ColorConversions oferece métodos para converter entre os seguintes espaços de cores - CIE-L * CH, CIE-L * ab, CIE-L * uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ e YXY.

ImageMagick

ImageMagick é um pacote de software para criar, editar, compor ou converter imagens bitmap. Ele pode ler e gravar imagens em mais de 100 formatos, incluindo DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG e TIFF. Use o ImageMagick para redimensionar, inverter, espelhar, girar, distorcer, distorcer e transformar imagens, ajustar as cores da imagem, aplicar vários efeitos especiais ou desenhar texto, linhas, polígonos, elipses e curva de Bezier.

Alguns dos recursos básicos do ImageMagick são descritos abaixo -

Sr. Não. Recurso e descrição
1

Format conversion

Ele converte uma imagem de um formato para outro (por exemplo, PNG para JPEG).

2

Transform

Ele pode redimensionar, girar, cortar, inverter ou aparar uma imagem.

3

Transparency

Ele torna partes de uma imagem invisíveis.

4

Draw

Ele adiciona formas ou texto a uma imagem.

5

Decorate

Ele adiciona uma borda ou moldura a uma imagem.

6

Special effects

Ele pode borrar, aumentar a nitidez, definir o limite ou tingir uma imagem.

7

Animation

Ele pode criar uma sequência de animação GIF a partir de um grupo de imagens.

8

Composite

Ele pode sobrepor uma imagem sobre a outra.

9

Morphology of shapes

Ele extrai recursos, descreve formas e reconhece padrões em imagens.

10

Encipher or decipher an image

Ele converte imagens comuns em jargões ininteligíveis e vice-versa.

Endrov

Endrov é um programa de análise de imagem multiuso. Ele é escrito de forma independente e projetado para resolver muitas das deficiências de outros softwares livres e muitos pacotes comerciais.

Alguns dos recursos básicos do Endrov são descritos abaixo -

Sr. Não. Recurso e descrição
1

View data

Ele visualiza dados, em 2D e 3D. Projetado para lidar com esquemas de dados 4D complexos e número ilimitado de canais, onde cada canal pode ter sua própria resolução X, Y e Z.

2

Annotate your images

Ele anota suas imagens, automaticamente ou à mão, para entendê-las e obter estatísticas.

3

Undo and Redo

Ele pode desfazer e refazer para todas as operações.

4

Lazy Evaluation

Ele é projetado desde o início para lidar com grandes conjuntos de imagens. Endrov usa avaliação preguiçosa, um conceito disponível principalmente em linguagens de programação de pesquisa.

5

Scripting language

Suporta linguagem de script gráfico, bem como script tradicional.

6

Java

Escrito em Java. A arquitetura de plug-in permite fácil extensão com novos plug-ins Java. Ele pode interagir com o Matlab.

7

Formats

Ele acessa quase todos os formatos de arquivos comerciais e abertos usando Bio-formatos.

8

Microscopic Processing

Ele pode controlar todos os seus microscópios com um programa e fazer análises de imagens em tempo real.

LEADTOOLS

O LEADTOOLS oferece mais de 200 funções de processamento de imagem em várias categorias, incluindo limpeza de documentos, aprimoramento de imagens médicas, conversão e correção de cores, redução de ruído, detecção de bordas e muito mais.

Alguns dos recursos básicos do LEADTOOLS são descritos abaixo -

Sr. Não. Recurso e descrição
1

Scanned Document Image Processing

Esta poderosa coleção de funções pode ler documentos digitalizados de artefatos e imperfeições, como orifícios perfurados, ângulos inclinados, bordas, manchas de poeira e muito mais.

2

Medical Image Processing

Aprimore a imagem ou destaque os detalhes deslocando, selecionando, subtraindo e removendo o plano de fundo para obter melhores imagens.

3

Geometric Transformation

Essas funções podem ser usadas para limpar, alinhar, corrigir imagens ou aplicar efeitos 3D artísticos.

4

Brightness and Contrast

Essas funções podem ser usadas para aprimorar imagens, aplicar efeitos artísticos ou auxiliar na avaliação diagnóstica de imagens médicas.

5

Color Space Conversion

Eles podem adicionar funcionalidade de espaço de cores de imagem a aplicativos simples e multithread, incluindo aplicativos hospedados em IIS e Windows WF.

6

Color Correction

Essas funções são usadas para corrigir imagens com canais de cores trocados, equilibrar intensidades de cores ou executar várias tarefas de análise de imagens.

7

Image Enhancement

Essas funções são usadas para corrigir erros comuns em fotografia, como olhos vermelhos e cores desequilibradas, bem como auxiliar na avaliação diagnóstica de imagens médicas.

8

Region of Interest

Essas funções são usadas para criar e modificar regiões de interesse em imagens para executar funções de processamento de imagem em partes específicas de uma imagem, economizar tempo em código de barras e reconhecimento de OCR ou executar várias tarefas de análise de imagem.

OpenCV

O OpenCV é lançado sob uma licença BSD e, portanto, é gratuito para uso acadêmico e comercial. Possui interfaces C ++, C, Python e Java e é compatível com Windows, Linux, Mac OS, iOS e Android. O OpenCV foi projetado para eficiência computacional e com forte foco em aplicativos de tempo real. Escrita em C / C ++ otimizado, a biblioteca pode aproveitar as vantagens do processamento de vários núcleos.

Alguns recursos básicos do OpenCV são descritos resumidamente -

Sr. Não. Recurso e descrição
1

Smoothing Images

Isso envolve a aplicação de Blur, GaussianBlur, medianBlur e filtro bilateral.

2

Eroding and Dilating

Pode aplicar dois operadores morfológicos muito comuns - Dilatação e Erosão.

3

Morphology Transformations

Morfologia da função OpenCVEx para aplicar Transformação Morfológica, como abertura, fechamento, TopHat e BlackHat etc.

4

Image Pyramids

O OpenCV funciona com pyrUp e pyrDown para baixar ou aumentar a amostra de uma determinada imagem.

4

Basic Thresholding Operations

Execute operações básicas de limite usando o limite de função OpenCV.

5

Adding borders to your images

A função OpenCV copyMakeBorder é usada para definir as bordas (preenchimento extra para sua imagem).

7

Remapping

No OpenCV, o remapeamento da função oferece uma implementação de remapeamento simples.

8

Histogram Calculation

Para fins simples, o OpenCV implementa a função calcHist, que calcula o histograma de um conjunto de arrays (geralmente imagens ou planos de imagens). Pode operar com até 32 dimensões.

O OpenCV é lançado sob uma licença BSD e, portanto, é gratuito para uso acadêmico e comercial. Possui interfaces C ++, C, Python e Java e oferece suporte a Windows, Linux, Mac OS, iOS e Android.

O OpenCV foi projetado para eficiência computacional e com forte foco em aplicativos de tempo real. Escrita em C / C ++ otimizado, a biblioteca pode aproveitar as vantagens do processamento de vários núcleos.

Alguns dos recursos básicos do OpenCV são descritos abaixo -

Sr. Não. Recurso e descrição
1

Smoothing Images

Isso envolve a aplicação de Blur, GaussianBlur, medianBlur e filtro bilateral.

2

Eroding and Dilating

Pode aplicar dois operadores morfológicos muito comuns - Dilatação e Erosão.

3

Morphology Transformations

Morfologia da função OpenCVEx para aplicar Transformação Morfológica, como abertura, fechamento, TopHat e BlackHat etc.

4

Image Pyramids

O OpenCV funciona com pyrUp e pyrDown para baixar ou aumentar a amostra de uma determinada imagem.

4

Basic Thresholding Operations

Ele pode realizar operações básicas de limite usando o limite de função OpenCV.

5

Adding borders to your images

A função OpenCV copyMakeBorder é usada para definir as bordas (preenchimento extra para sua imagem).

7

Remapping

No OpenCV, o remapeamento da função oferece uma implementação de remapeamento simples.

8

Histogram Calculation

Para fins simples, o OpenCV implementa a função calcHist, que calcula o histograma de um conjunto de arrays (geralmente imagens ou planos de imagens). Pode operar com até 32 dimensões.

Integrando OpenCV

As etapas a seguir explicam como integrar o OpenCV em seus aplicativos.

Baixar OpenCV

Você pode baixar o OpenCV do site oficial aqui .

Criar biblioteca de usuário

Além disso, criamos uma biblioteca de usuário do OpenCV, para que possamos usá-la como um projeto futuro.

Lançar Eclipse

Selecione Janela -> Preferências no menu.

Navegue em Java -> Caminho de construção -> Bibliotecas do usuário e clique em Novo.

Agora digite o nome da sua biblioteca. Por exemplo, OpenCV-2.4.6.

Depois disso, selecione sua nova biblioteca de usuário (ou seja, OpenCV-2.4.6) e clique em Adicionar JARs externos.

Navegue até C: \ OpenCV-2.4.6 \ build \ java \ e selecione opencv-246.jar. Depois de adicionar o jar, estenda o opencv-246.jar, selecione o local da biblioteca nativa e pressione Editar.

Selecione Pasta externa ... e navegue para selecionar a pasta C: \ OpenCV-2.4.6 \ build \ java \ x64. Se você tiver um sistema de 32 bits, precisará selecionar a pasta x86 em vez de x64.

Pressione Ok e pronto.

Agora sua biblioteca de usuário está criada. Agora você pode reutilizar esta configuração em qualquer projeto.

Criar Projeto OpenCV

Crie um novo projeto java no eclipse.

Na etapa Configurações Java, na guia Bibliotecas, selecione Adicionar biblioteca ... e selecione OpenCV-2.4.6 e clique em Concluir.

Clique em Concluir e pronto.

A fim de converter uma imagem colorida em uma imagem em tons de cinza usando OpenCV, lemos a imagem em BufferedImage e convertê-lo em MatObjeto. Sua sintaxe é fornecida abaixo -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

Então você pode transformar a imagem do formato RGB para tons de cinza usando o método cvtColor() no Imgprocclasse. Sua sintaxe é fornecida abaixo -

Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);

O método cvtColor() usa três parâmetros que são a matriz da imagem de origem, a matriz da imagem de destino e o tipo de conversão de cores.

Além do método cvtColor, existem outros métodos fornecidos pela classe Imgproc. Eles estão listados abaixo -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para converter uma imagem em tons de cinza -

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

import java.io.File;
import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) { 
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         File input = new File("digital_image_processing.jpg");
         BufferedImage image = ImageIO.read(input);	

         byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
         Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
         mat.put(0, 0, data);

         Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC1);
         Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY);

         byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(),mat1.rows(), BufferedImage.TYPE_BYTE_GRAY);
         image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1);

         File ouptut = new File("grayscale.jpg");
         ImageIO.write(image1, "jpg", ouptut);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o exemplo dado, ele converte o nome de uma imagem digital_image_processing.jpg para sua imagem em tons de cinza equivalente e grava no disco rígido com o nome grayscale.jpg.

Imagem original

Imagem em tons de cinza

A fim de mudar o espaço de cor de uma imagem para outra usando OpenCV, lemos a imagem em BufferedImage e convertê-lo em MatObjeto. Sua sintaxe é fornecida abaixo -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

OpenCv permite muitos tipos de conversão de cores, todos os quais podem ser encontrados na classe Imgproc. Alguns dos tipos são descritos resumidamente -

Sr. Não. Tipo de conversão de cor
1 COLOR_RGB2BGR
2 COLOR_RGB2BGRA
3 COLOR_RGB2GRAY
4 COLOR_RGB2HLS
5 COLOR_RGB2HSV
6 COLOR_RGB2Luv
7 COLOR_RGB2YUV
8 COLOR_RGB2Lab

De qualquer tipo de conversão de cor, basta passar o apropriado para o método cvtColor() no Imgprocclasse. Sua sintaxe é fornecida abaixo -

Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);

O método cvtColor() usa três parâmetros que são a matriz da imagem de origem, a matriz da imagem de destino e o tipo de conversão de cores.

Além do método cvtColor (), existem outros métodos fornecidos pela classe Imgproc. Eles são descritos resumidamente -

Sr. Não. Método e Descrição
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Ele converte uma imagem de um espaço de cores para outro.

2

dilate(Mat src, Mat dst, Mat kernel)

Ele dilata uma imagem usando um elemento estruturante específico.

3

equalizeHist(Mat src, Mat dst)

Equaliza o histograma de uma imagem em tons de cinza.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Ele envolve uma imagem com o kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Desfoca uma imagem usando um filtro gaussiano.

6

integral(Mat src, Mat sum)

Ele calcula a integral de uma imagem.

Exemplo

O exemplo a seguir demonstra o uso da classe Imgproc para converter uma imagem de um espaço de cores para outro.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

import java.io.File;
import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         File input = new File("digital_image_processing.jpg");
         BufferedImage image = ImageIO.read(input);	
         byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
         Mat mat = new Mat(image.getHeight(),image.getWidth(), CvType.CV_8UC3);
         mat.put(0, 0, data);

         Mat mat1 = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
         Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2HSV);

         byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5);
         image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1);

         File ouptut = new File("hsv.jpg");
         ImageIO.write(image1, "jpg", ouptut);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o exemplo dado, ele converte o nome de uma imagem digital_image_processing.jpg em sua imagem de espaço de cor HSV equivalente e grava no disco rígido com o nome hsv.jpg.

Imagem Original (RGB)

Imagem convertida (HSV)