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 BufferedImage
classe 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 BufferedImage
objetos 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 BufferedImage
com um ColorModel e Raster especificados.
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
O segundo construtor constrói um BufferedImage
de um dos tipos de imagem predefinidos.
BufferedImage(int width, int height, int imageType)
O terceiro construtor constrói um BufferedImage
de 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 |
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 |
5 | getGraphics() Este método retorna um Graphics2D, mantém a compatibilidade com versões anteriores. |
6 | getHeight() Ele retorna a altura do |
7 | getMinX() Ele retorna a coordenada x mínima disso |
8 | getMinY() Ele retorna a coordenada y mínima disso |
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 BufferedImage
classe 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.