Java DIP-퀵 가이드
디지털 이미지 처리 (DIP)는 디지털 컴퓨터를 사용하여 디지털 이미지를 조작합니다. 신호 및 시스템의 하위 분야이지만 특히 이미지에 중점을 둡니다. DIP는 이미지 처리를 수행 할 수있는 컴퓨터 시스템 개발에 중점을 둡니다. 이러한 시스템의 입력은 디지털 이미지입니다. 시스템은 효율적인 알고리즘을 사용하여 이미지를 처리하고 이미지를 출력으로 제공합니다.

Java는 현대 세계에서 널리 사용되는 고급 프로그래밍 언어입니다. 다양한 기능을 이용하여 디지털 이미지 처리를 효율적으로 지원하고 처리 할 수 있습니다.
Java BufferedImage
클래스는 Image 클래스의 하위 클래스입니다. 이미지 데이터를 처리하고 조작하는 데 사용됩니다. A BufferedImage
는 이미지 데이터의 ColorModel로 구성됩니다. 모든 BufferedImage
개체의 왼쪽 위 모서리 좌표는 (0, 0)입니다.
생성자
이 클래스는 세 가지 유형의 생성자를 지원합니다.
첫 번째 생성자 BufferedImage
는 지정된 ColorModel 및 Raster를 사용 하여 새 생성자를 생성합니다 .
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
두 번째 생성자 BufferedImage
는 미리 정의 된 이미지 유형 중 하나를 생성합니다.
BufferedImage(int width, int height, int imageType)
세 번째 생성자 BufferedImage
는 미리 정의 된 이미지 유형 TYPE_BYTE_BINARY 또는 TYPE_BYTE_INDEXED 중 하나를 생성합니다 .
BufferedImage(int width, int height, int imageType, IndexColorModel cm)
Sr. 아니요 | 방법 및 설명 |
---|---|
1 | copyData(WritableRaster outRaster) 의 임의의 직사각형 영역을 계산 |
2 | getColorModel() 이미지의 ColorModel 클래스의 객체를 반환합니다. |
삼 | getData() 이미지를 하나의 큰 타일로 반환합니다. |
4 | getData(Rectangle rect) 의 임의 영역을 계산하고 반환합니다 |
5 | getGraphics() 이 메서드는 Graphics2D를 반환하고 이전 버전과의 호환성을 유지합니다. |
6 | getHeight() 의 높이를 반환합니다 |
7 | getMinX() 이것의 최소 x 좌표를 반환합니다 |
8 | getMinY() 이것의 최소 y 좌표를 반환합니다 |
9 | getRGB(int x, int y) 기본 RGB 색상 모델 (TYPE_INT_ARGB) 및 기본 sRGB 색상 공간에서 정수 픽셀을 반환합니다. |
10 | getType() 이미지 유형을 반환합니다. |
예
다음 예제는 BufferedImage
Graphics Object를 사용하여 화면에 텍스트를 그리는 Java 클래스 의 사용을 보여줍니다.
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);
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
이 장에서는 인터넷에서 이미지를 다운로드하고 이미지에 대해 몇 가지 이미지 처리 기술을 수행 한 다음 처리 된 이미지를 다시 서버에 업로드하는 방법을 살펴 보겠습니다.
이미지 다운로드
웹 사이트에서 이미지를 다운로드하기 위해 우리는 자바 클래스를 사용합니다. URL, 아래에서 찾을 수 있습니다. java.net꾸러미. 구문은 다음과 같습니다.
String website = "http://tutorialspoint.com";
URL url = new URL(website);
위의 방법 외에도 간략하게 설명 된대로 클래스 URL에서 사용할 수있는 다른 방법이 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public String getPath() URL의 경로를 반환합니다. |
2 | public String getQuery() URL의 쿼리 부분을 반환합니다. |
삼 | public String getAuthority() URL의 권한을 반환합니다. |
4 | public int getPort() URL의 포트를 반환합니다. |
5 | public int getDefaultPort() URL 프로토콜의 기본 포트를 반환합니다. |
6 | public String getProtocol() URL의 프로토콜을 반환합니다. |
7 | public String getHost() URL의 호스트를 반환합니다. |
예
다음 예제는 자바 URL 클래스를 사용하여 인터넷에서 이미지를 다운로드하는 방법을 보여줍니다.
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());
}
}
}
산출
위에서 주어진 것을 실행하면 다음과 같은 출력이 표시됩니다.
서버에서 다음 이미지를 다운로드합니다.

이미지 업로드
웹 서버에 이미지를 업로드하는 방법을 살펴 보겠습니다. BufferedImage를 서버로 보내기 위해 바이트 배열로 변환합니다.
우리는 자바 클래스를 사용합니다 ByteArrayOutputStream, 아래에서 찾을 수 있습니다. java.io꾸러미. 구문은 다음과 같습니다.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
이미지를 바이트 배열로 변환하기 위해 toByteArray() 의 방법 ByteArrayOutputStream수업. 구문은 다음과 같습니다.
byte[] bytes = baos.toByteArray();
위의 방법 외에도 간략하게 설명 된대로 ByteArrayOutputStream 클래스에서 사용할 수있는 다른 방법이 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public void reset() 이 메서드는 바이트 배열 출력 스트림의 유효한 바이트 수를 0으로 재설정하여 스트림에 누적 된 모든 출력을 버립니다. |
2 | public byte[] toByteArray() 이 메서드는 새로 할당 된 Byte 배열을 만듭니다. 그 크기는 출력 스트림의 현재 크기이며 버퍼의 내용이 여기에 복사됩니다. 출력 스트림의 현재 내용을 바이트 배열로 반환합니다. |
삼 | public String toString() 버퍼 내용을 문자열로 변환합니다. 기본 문자 인코딩에 따라 번역이 수행됩니다. 버퍼의 내용에서 번역 된 문자열을 반환합니다. |
4 | public void write(int w) 지정된 배열을 출력 스트림에 씁니다. |
5 | public void write(byte []b, int of, int len) 오프셋 오프에서 시작하여 len 바이트 수를 스트림에 씁니다. |
6 | public void writeTo(OutputStream outSt) 이 Stream의 전체 내용을 지정된 스트림 인수에 씁니다. |
예
다음 예제는 서버에 이미지를 업로드하는 ByteArrayOutputStream을 보여줍니다-
클라이언트 코드
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();
}
}
서버 코드
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);
}
}
산출
클라이언트 측 출력
클라이언트 코드를 실행하면 다음 출력이 클라이언트 측에 나타납니다.
서버 측 출력
서버 코드를 실행하면 다음 출력이 서버 측에 나타납니다.
이미지 수신 후 서버는 아래와 같이 이미지를 표시합니다.
이미지에는 2 차원 픽셀 배열이 포함됩니다. 실제로 이미지를 구성하는 픽셀의 값입니다. 일반적으로 이미지는 컬러 또는 회색조 일 수 있습니다.
Java에서 BufferedImage 클래스는 이미지를 처리하는 데 사용됩니다. 당신은 전화해야합니다getRGB() 의 방법 BufferedImage 픽셀 값을 가져 오는 클래스입니다.
픽셀 값 얻기
픽셀 값은 다음 구문을 사용하여 수신 할 수 있습니다.
Color c = new Color(image.getRGB(j, i));
RGB 값 얻기
방법 getRGB()행 및 열 인덱스를 매개 변수로 취하고 적절한 픽셀을 리턴합니다. 컬러 이미지의 경우 (Red, Green, Blue)의 세 가지 값을 반환합니다. 다음과 같이 얻을 수 있습니다.
c.getRed();
c.getGreen();
c.getBlue();
이미지의 너비와 높이 얻기
이미지의 높이와 너비는 getWidth() 과 getHeight()BufferedImage 클래스의 메소드. 구문은 다음과 같습니다.
int width = image.getWidth();
int height = image.getHeight();
이러한 메서드 외에도 BufferedImage 클래스에서 지원되는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | copyData(WritableRaster outRaster) BufferedImage의 임의의 직사각형 영역을 계산하고 지정된 WritableRaster에 복사합니다. |
2 | getColorModel() 이미지의 ColorModel을 반환합니다. |
삼 | getData() 이미지를 하나의 큰 타일로 반환합니다. |
4 | getData(Rectangle rect) BufferedImage의 임의 영역을 계산하고 반환합니다. |
5 | getGraphics() 이 메서드는 Graphics2D를 반환하지만 이전 버전과의 호환성을 위해 여기에 있습니다. |
6 | getHeight() BufferedImage의 높이를 반환합니다. |
7 | getMinX() 이 BufferedImage의 최소 x 좌표를 리턴합니다. |
8 | getMinY() 이 BufferedImage의 최소 y 좌표를 리턴합니다. |
9 | getRGB(int x, int y) 기본 RGB 색상 모델 (TYPE_INT_ARGB) 및 기본 sRGB 색상 공간에서 정수 픽셀을 반환합니다. |
10 | getType() 이미지 유형을 반환합니다. |
예
다음 예제는 크기 (100 x 100)의 이미지 픽셀을 표시하는 java BufferedImage 클래스의 사용을 보여줍니다.
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();
}
}
산출
위의 예제를 실행하면 다음 이미지의 픽셀이 인쇄됩니다.
Original Image

Pixels Output
출력을 아래로 스크롤하면 다음 패턴이 보입니다.
컬러 이미지를 그레이 스케일 이미지로 변환하려면 다음을 사용하여 이미지의 픽셀 또는 데이터를 읽어야합니다. File 과 ImageIO 개체 및 이미지 저장 BufferedImage목적. 구문은 다음과 같습니다.
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
또한 방법을 사용하여 픽셀 값을 가져옵니다. getRGB()그것에 GrayScale () 메서드를 수행합니다. getRGB () 메소드는 행 및 열 색인을 매개 변수로 사용합니다.
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);
이 세 가지 방법 외에도 간단히 설명 된대로 Color 클래스에서 사용할 수있는 다른 방법이 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | brighter() 이 색상의 더 밝은 버전 인 새로운 색상을 만듭니다. |
2 | darker() 이 색상의 더 어두운 버전 인 새 색상을 만듭니다. |
삼 | getAlpha() 0-255 범위의 알파 구성 요소를 반환합니다. |
4 | getHSBColor(float h, float s, float b) HSB 색상 모델에 대해 지정된 값을 기반으로 Color 개체를 만듭니다. |
5 | HSBtoRGB(float hue, float saturation, float brightness) HSB 모델에 지정된대로 색상의 구성 요소를 기본 RGB 모델에 해당하는 값 세트로 변환합니다. |
6 | toString() 이 Color의 문자열 표현을 반환합니다. |
마지막 단계는이 세 값을 모두 추가하고 해당 픽셀 값으로 다시 설정하는 것입니다. 구문은 다음과 같습니다.
int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());
예
다음 예제는 이미지를 그레이 스케일로 변환하는 Java BufferedImage 클래스의 사용을 보여줍니다.
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();
}
}
산출
주어진 예제를 실행하면 이미지를 변환합니다. digital_image_processing.jpg 동등한 그레이 스케일 이미지에 저장하고 이름으로 하드 디스크에 씁니다. grayscale.jpg.
원본 이미지

그레이 스케일 이미지

이 장에서는 히스토그램 이퀄라이제이션을 사용하여 이미지의 대비를 향상시키는 방법을 알아 봅니다.
우리는 OpenCV 함수 equalizeHist()방법. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.equalizeHist(source, destination);
매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | Source 8 비트 단일 채널 소스 이미지입니다. |
2 | Destination 목적지 이미지입니다. |
equalizeHist () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 이미지의 대비를 향상시키기 위해 Imgproc 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

향상된 대비 이미지

이 장에서는 이미지의 각 픽셀에 알파 값을 곱하고 또 다른 베타 값을 추가하여 이미지의 밝기를 향상시킵니다.
우리 OpenCV 함수 convertTo위의 작업을 자동으로 수행합니다. 아래에서 찾을 수 있습니다.Mat꾸러미. 구문은 다음과 같습니다.
int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);
매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | destination 목적지 이미지입니다. |
2 | rtype 채널 수가 입력과 동일하므로 원하는 출력 매트릭스 유형 또는 깊이입니다. rtype이 음수이면 출력 행렬은 입력과 동일한 유형을 갖습니다. |
삼 | alpha 선택적 축척 비율입니다. |
4 | beta 스케일링 된 값에 추가되는 선택적 델타입니다. |
convertTo 메서드 외에도 Mat 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | adjustROI(int dtop, int dbottom, int dleft, int dright) 부모 행렬 내에서 부분 행렬 크기와 위치를 조정합니다. |
2 | copyTo(Mat m) 매트릭스를 다른 매트릭스로 복사합니다. |
삼 | diag() 행렬에서 대각선을 추출하거나 대각선 행렬을 만듭니다. |
4 | dot(Mat m) 두 벡터의 내적을 계산합니다. |
5 | reshape(int cn) 데이터를 복사하지 않고 2D 매트릭스의 모양 및 / 또는 채널 수를 변경합니다. |
6 | submat(Range rowRange, Range colRange) 직사각형 부분 행렬을 추출합니다. |
예
다음 예제는 이미지의 밝기를 향상시키기 위해 Mat 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

향상된 밝은 이미지 (알파 = 1 및 베타 = 50)

향상된 밝은 이미지 (알파 = 2 및 베타 = 50)

이 장에서는 가우시안 필터를 사용하여 이미지의 선명도를 높이는 방법을 배웁니다.
먼저 우리는 OpenCV 함수 GaussianBlur. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);
매개 변수는 간략하게 설명됩니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | source 소스 이미지입니다. |
2 | destination 목적지 이미지입니다. |
삼 | Size 가우스 커널 크기입니다. |
4 | sigmaX X 방향의 가우스 커널 표준 편차입니다. |
또한, 우리는 OpenCV 함수 addWeighted이미지에 이미지 워터 마크를 적용합니다. 아래에서 찾을 수 있습니다.Core꾸러미. 구문은 다음과 같습니다.
Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);
이 함수의 매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | src1 첫 번째 입력 배열입니다. |
2 | alpha 첫 번째 배열 요소의 가중치입니다. |
삼 | src2 src1과 동일한 크기 및 채널 번호의 두 번째 입력 배열입니다. |
4 | Beta 두 번째 배열 요소의 가중치입니다. |
5 | gamma 각 합계에 추가 된 스칼라입니다. |
6 | dst 입력 배열과 크기와 채널 수가 동일한 출력 배열입니다. |
GaussianBlur 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 이미지에 선명 효과를 적용하기 위해 Imgproc 및 Core 클래스를 사용하는 방법을 보여줍니다.
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) {
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

선명한 이미지

이미지는 Java를 통해 쉽게 압축 및 저장할 수 있습니다. 이미지 압축에는 이미지를 jpg로 변환하고 저장하는 작업이 포함됩니다.
이미지를 압축하기 위해 이미지를 읽고 BufferedImage 객체로 변환합니다.
또한 ImageWriter는 getImageWritersByFormatName()ImageIO 클래스에있는 메서드입니다. 이 ImageWriter에서ImageWriteParam목적. 구문은 다음과 같습니다.
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
이 ImageWriteParam 객체에서 다음 두 메서드를 호출하여 압축을 설정할 수 있습니다. setCompressionMode() 과 setCompressionQuality(). 구문은 다음과 같습니다.
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
setCompressionMode () 메소드는 Mode_EXPLICIT를 매개 변수로 사용합니다. 다른 모드 중 일부는 간략하게 설명합니다.
Sr. 아니. | 모드 |
---|---|
1 | MODE_DEFAULT 향후 쓰기를 위해 해당 기능을 활성화하기 위해 메서드에 전달할 수있는 상수 값입니다. |
2 | MODE_DISABLED 향후 쓰기를 위해 해당 기능을 비활성화하기 위해 메서드에 전달할 수있는 상수 값입니다. |
삼 | MODE_EXPLICIT 향후 쓰기를 위해 해당 기능을 활성화하기 위해 메서드에 전달할 수있는 상수 값입니다. |
압축 메서드 외에도 ImageWriteParam 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | canOffsetTiles() 작성기가 작성하는 동안 0이 아닌 그리드 오프셋으로 타일링을 수행 할 수 있으면 true를 반환합니다. |
2 | getBitRate(float quality) 주어진 품질 수준에서 입력 이미지 데이터의 각 비트에 대한 출력 데이터의 비트 수 추정치를 나타내는 부동 소수점을 반환합니다. |
삼 | getLocale() 현재 설정된 로케일을 반환하거나 기본 로케일 만 지원되는 경우 null을 반환합니다. |
4 | isCompressionLossless() 현재 압축 유형이 무손실 압축을 제공하는 경우 true를 리턴합니다. |
5 | unsetCompression() 이전 압축 유형 및 품질 설정을 제거합니다. |
6 | unsetTiling() setTiling 호출로 지정된 이전 타일 그리드 매개 변수를 제거합니다. |
예
다음 예제는 ImageWriteParam 클래스를 사용하여 이미지를 압축하는 방법을 보여줍니다.
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();
}
}
산출
주어진 코드를 실행하면 이미지가 압축됩니다. digital_image_processing.jpg 동등한 압축 이미지에 저장하고 이름으로 하드 디스크에 씁니다. compress.jpg.
원본 이미지

압축 이미지-품질 계수 − 0.05

압축 이미지-품질 계수 − 0.5

이 장에서는 이미지에 다양한 유형의 테두리를 추가하는 방법을 배웁니다.
우리는 사용 OpenCV 함수 copyMakeBorder. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);
매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | source 소스 이미지입니다. |
2 | destination 목적지 이미지입니다. |
삼 | top 이미지 상단 테두리의 길이 (픽셀 단위)입니다. |
4 | bottom 이미지 하단 테두리의 길이 (픽셀)입니다. |
5 | left 이미지 왼쪽 테두리의 길이 (픽셀 단위)입니다. |
6 | right 이미지 오른쪽 테두리의 길이 (픽셀 단위)입니다. |
7 | borderType 테두리 유형을 정의합니다. 가능한 테두리는 BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_CONSTANT 등입니다. |
copyMakeBorder () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 이미지에 테두리를 추가하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

격리 된 테두리 이미지

래핑 된 테두리 이미지

테두리 이미지 반영

이미지 피라미드는 다중 해상도 이미지를 표시하는 방법 일뿐입니다. 가장 낮은 레이어는 이미지의 가장 높은 해상도 버전이고 가장 높은 레이어는 이미지의 가장 낮은 해상도 버전입니다. 이미지 피라미드는 다양한 크기로 이미지를 처리하는 데 사용됩니다.
이 장에서는 이미지에 대한 다운 샘플링과 업 샘플링을 수행합니다.
우리는 사용 OpenCV 기능 pyrUp 과 pyrDown. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);
매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | source 소스 이미지입니다. |
2 | destination 목적지 이미지입니다. |
삼 | destinationSize 출력 이미지의 크기입니다. 기본적으로 크기 ((src.cols * 2), (src.rows * 2))로 계산됩니다. |
pyrUp 및 pyrDown 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 이미지에서 업 샘플링 및 다운 샘플링을 수행하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

원본 이미지에는 pyrUp (UP Sampling)과 pyrDown (Down Sampling)이 수행됩니다. 샘플링 후 출력은 다음과 같습니다.
PyrUP 이미지
pyrDown 이미지

임계 값을 사용하면 가장 쉬운 방법으로 이미지 분할을 달성 할 수 있습니다. 이미지 분할은 각 세트의 픽셀이 몇 가지 공통 특성을 갖도록 전체 이미지를 픽셀 세트로 분할하는 것을 의미합니다. 이미지 분할은 객체와 경계를 정의하는 데 매우 유용합니다.
이 장에서는 이미지에 대한 몇 가지 기본 임계 값 작업을 수행합니다.
우리는 사용 OpenCV 함수 threshold. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.threshold(source, destination, thresh , maxval , type);
매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | source 소스 이미지입니다. |
2 | destination 목적지 이미지입니다. |
삼 | thresh 임계 값입니다. |
4 | maxval THRESH_BINARY 및 THRESH_BINARY_INV 임계 값 유형과 함께 사용할 최대 값입니다. |
5 | type 가능한 유형은 THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC 및 THRESH_TOZERO입니다. |
이러한 임계 값 방법 외에도 Imgproc 클래스에서 제공하는 다른 방법이 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 이미지에 대한 임계 값 작업을 수행하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

위의 원본 이미지에서 아래 출력에 표시된 일부 임계 값 작업이 수행됩니다.
쓰레 쉬 바이너리

쓰레 쉬 이진 반전

쓰레 쉬 제로

OpenCV를 사용하여 이미지의 모양을 쉽게 변경할 수 있습니다. 이미지는 4 가지 방향 중 하나로 뒤집거나, 크기를 조정하거나, 회전 할 수 있습니다.
이미지의 모양을 변경하기 위해 이미지를 읽고 Mat 객체로 변환합니다. 구문은 다음과 같습니다.
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
이미지 뒤집기
OpenCV는 아래에 설명 된 세 가지 유형의 플립 코드를 허용합니다.
Sr. 아니. | 플립 코드 및 설명 |
---|---|
1 | 0 0은 x 축을 기준으로 뒤집 음을 의미합니다. |
2 | 1 1은 y 축을 기준으로 뒤집는 것을 의미합니다. |
삼 | -1 -1은 양쪽 축을 중심으로 뒤집는 것을 의미합니다. |
적절한 플립 코드를 메서드에 전달합니다. flip() 에 Core수업. 구문은 다음과 같습니다.
Core.flip(source mat, destination mat1, flip_code);
방법 flip() 소스 이미지 매트릭스, 대상 이미지 매트릭스 및 플립 코드의 세 가지 매개 변수를 사용합니다.
flip 메서드 외에도 Core 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | add(Mat src1, Mat src2, Mat dst) 두 배열 또는 배열과 스칼라의 요소 당 합계를 계산합니다. |
2 | bitwise_and(Mat src1, Mat src2, Mat dst) 두 배열 또는 배열과 스칼라의 요소 별 비트 결합을 계산합니다. |
삼 | bitwise_not(Mat src, Mat dst) 배열의 모든 비트를 반전합니다. |
4 | circle(Mat img, Point center, int radius, Scalar color) 원을 그립니다. |
5 | sumElems(Mat src) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | subtract(Mat src1, Scalar src2, Mat dst, Mat mask) 두 배열 또는 배열과 스칼라 간의 요소 별 차이를 계산합니다. |
예
다음 예제는 Core 클래스를 사용하여 이미지를 뒤집는 방법을 보여줍니다.
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());
}
}
}
산출
위의 예를 실행하면 이미지 이름이 뒤집 힙니다. digital_image_processing.jpg 상응하는 HSV 색 공간 이미지에 저장하고 이름으로 하드 디스크에 씁니다. flip.jpg.
원본 이미지

뒤집힌 이미지

이 장에서는 이미지를 흐리게하는 이미지에 가우시안 필터를 적용합니다. OpenCV 함수 GaussianBlur를 사용하여 Gaussian 필터를 이미지에 적용합니다. Imgproc 패키지에서 찾을 수 있습니다. 구문은 다음과 같습니다.
Imgproc.GaussianBlur(source, destination,Size,SigmaX);
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 및 설명 |
---|---|
1 | source 소스 이미지입니다. |
2 | destination 목적지 이미지입니다. |
삼 | Size 가우스 커널 크기입니다. |
4 | SigmaX X 방향의 가우스 커널 표준 편차입니다. |
GaussianBlur 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 이미지에 가우스 필터를 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지가 크기 11 및 45의 가우스 필터와 컨볼 루션되면 다음 출력이 표시됩니다.
크기 11의 가우스 필터

크기 45의 가우스 필터

이미지를 흐리게하는 Box 필터를 적용합니다. 상자 필터는 3x3, 5x5, 9x9 등의 크기 일 수 있습니다.
우리는 사용 OpenCV 함수 filter2D이미지에 상자 필터를 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 및 설명 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. 위치 점 (-1, -1)은 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 회색조 이미지에 Box 필터를 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 예에서는 이미지를 다음 필터 (커널)로 컨볼 루션합니다. 이 필터는 크기가 커짐에 따라 이미지를 흐리게 만듭니다.
이 원본 이미지는 아래에 주어진 크기 5의 상자 필터로 컨볼 루션되었습니다.
크기 5의 상자 필터
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
컨볼 브드 이미지 (크기 5의 상자 필터 포함)

컨볼 브드 이미지 (크기 9의 박스 필터 포함)

이 장에서는 확장과 침식이라는 두 가지 매우 일반적인 형태 연산자를 적용하는 방법을 배웁니다.
우리는 사용 OpenCV 함수 erode 과 dilate. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);
매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | source 소스 이미지입니다. |
2 | destination 목적지 이미지입니다. |
삼 | element 침식 및 팽창에 사용되는 구조 요소이며 element = Mat ()이면 3 x 3 직사각형 구조 요소가 사용됩니다. |
erode () 및 dilate () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 이미지에 침식 및 확장을 수행하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

위의 원본 이미지에서 아래 출력에 표시된 일부 침식 및 팽창 작업이 수행되었습니다.
부식

팽창

이 장에서는 이미지에 워터 마크를 적용하는 두 가지 방법을 배웁니다. 이러한 방법은-
- 텍스트 워터 마크 적용
- 이미지 워터 마크 적용
텍스트 워터 마크 적용
우리는 사용 OpenCV 함수 putText이미지에 텍스트 워터 마크를 적용합니다. 아래에서 찾을 수 있습니다.Core꾸러미. 구문은 다음과 같습니다.
Core.putText(source, Text, Point, fontFace ,fontScale , color);
이 함수의 매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | Source 소스 이미지입니다. |
2 | Text 이미지에 표시되는 문자열 텍스트입니다. |
삼 | Point 이미지에 텍스트가 나타나야하는 지점입니다. |
4 | fontFace 글꼴 유형. 예 : FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX 등 |
5 | fontScale 글꼴 별 기본 크기를 곱한 글꼴 배율 인수입니다. |
6 | color 텍스트 색상입니다. |
putText 메서드 외에도 Core 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | normalize(Mat src, Mat dst, double alpha, double beta, int norm_type) 배열의 표준 또는 값 범위를 정규화합니다. |
2 | perspectiveTransform(Mat src, Mat dst, Mat m) 벡터의 원근 행렬 변환을 수행합니다. |
삼 | phase(Mat x, Mat y, Mat angle) 2D 벡터의 회전 각도를 계산합니다. |
4 | rectangle(Mat img, Point pt1, Point pt2, Scalar color) 단순하거나 두껍거나 채워진 직립 직사각형을 그립니다. |
5 | reduce(Mat src, Mat dst, int dim, int rtype, int dtype) 행렬을 벡터로 줄입니다. |
6 | transform(Mat src, Mat dst, Mat m) 모든 배열 요소의 행렬 변환을 수행합니다. |
예
다음 예제는 Core 클래스를 사용하여 이미지에 텍스트 워터 마크를 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

텍스트 워터 마크 이미지

이미지에 이미지 워터 마크 적용
우리는 사용할 것입니다 OpenCV 함수 addWeighted이미지에 이미지 워터 마크를 적용합니다. 아래에서 찾을 수 있습니다.Core꾸러미. 구문은 다음과 같습니다.
Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);
이 함수의 매개 변수는 아래에 설명되어 있습니다.
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | src1 첫 번째 입력 배열입니다. |
2 | alpha 첫 번째 배열 요소의 가중치입니다. |
삼 | src2 src1과 크기 및 채널 번호가 동일한 두 번째 입력 배열입니다. |
4 | beta 두 번째 배열 요소의 가중치입니다. |
5 | gamma 각 합계에 더해지는 스칼라입니다. |
6 | dst 입력 배열과 크기와 채널 수가 동일한 출력 배열입니다. |
예
다음 예제는 이미지 워터 마크를 이미지에 적용하기 위해 Core 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

워터 마크 이미지

워터 마크 이미지

컨볼 루션은 두 함수 f와 g에 대한 수학적 연산입니다. 이 경우 함수 f와 g는 이미지이기도합니다. 이미지도 2 차원 함수이기 때문입니다.
컨볼 루션 수행
이미지에 컨볼 루션을 수행하기 위해 다음 단계가 수행됩니다.
- 마스크를 가로 및 세로로 한 번만 뒤집습니다.
- 마스크를 이미지 위로 슬라이드합니다.
- 해당 요소를 곱한 다음 추가하십시오.
- 이미지의 모든 값이 계산 될 때까지이 절차를 반복합니다.
우리는 사용 OpenCV 함수 filter2D이미지에 컨볼 루션을 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 및 설명 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. 위치 점 (-1, -1)은 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 그레이 스케일 이미지에 컨볼 루션을 수행하는 방법을 보여줍니다.
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());
}
}
}
산출
이 예에서는 다음 필터 (커널)로 이미지를 컨볼 루션합니다. 이 필터는 원본 이미지를 그대로 생성합니다.
0 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
원본 이미지

컨볼 브드 이미지

Prewitt 연산자는 이미지의 가장자리 감지에 사용됩니다. 수직 모서리와 수평 모서리의 두 가지 유형의 모서리를 감지합니다.
우리는 사용 OpenCV 함수 filter2DPrewitt 연산자를 이미지에 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 및 설명 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. 위치 점 (-1, -1)은 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 Prewitt 연산자를 그레이 스케일 이미지에 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지는 아래에 주어진 수직 가장자리의 Prewitt 연산자와 연결됩니다.
수직 방향
-1 | 0 | 1 |
-1 | 0 | 1 |
-1 | 0 | 1 |
Convolved Image (수직 방향)

이 원본 이미지는 또한 아래에 주어진 수평 가장자리의 Prewitt 연산자와 컨볼 루션되었습니다.
수평 방향
-1 | -1 | -1 |
0 | 0 | 0 |
1 | 1 | 1 |
Convolved Image (수평 방향)

Sobel 연산자는 Prewitt 연산자와 매우 유사합니다. 또한 미분 마스크이며 가장자리 감지에 사용됩니다. Sobel 연산자는 이미지에서 수직 방향 모서리와 수평 방향 모서리라는 두 종류의 모서리를 감지하는 데 사용됩니다.
우리는 사용할 것입니다 OpenCV 함수 filter2D이미지에 Sobel 연산자를 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 논의 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. 위치 점 (-1, -1)은 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 회색조 이미지에 Sobel 연산자를 적용하기 위해 Imgproc 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지는 아래에 주어진 수직 가장자리의 Sobel 연산자와 컨볼 루션됩니다.
수직 방향
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
Convolved Image (수직 방향)

이 원본은 아래에 주어진 수평 모서리의 Sobel 연산자와 연결됩니다.
수평 방향
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Convolved Image (수평 방향)

Kirsch 나침반 마스크는 가장자리 감지에 사용되는 또 다른 유형의 파생 마스크입니다. 이 연산자는 방향 마스크라고도합니다. 이 연산자에서는 마스크 하나를 가져 와서 8 개 나침반 방향으로 회전하여 8 개 방향의 가장자리를 얻습니다.
우리는 사용할 것입니다 OpenCV 함수 filter2DKirsch 연산자를 이미지에 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 논의 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. 위치 점 (-1, -1)은 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제에서는 Imgproc 클래스를 사용하여 Kirsch 연산자를 그레이 스케일 이미지에 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지는 아래에 주어진 것처럼 동쪽 가장자리의 Kirsch 연산자와 컨볼 루션됩니다.
Kirsch East
-삼 | -삼 | -삼 |
-삼 | 0 | -삼 |
5 | 5 | 5 |
Convolved Image (Kirsch East)

이 원본 이미지는 다음과 같이 South West 가장자리의 Kirsch 연산자와 연결되어 있습니다.
Kirsch South West
5 | 5 | -삼 |
5 | 0 | -삼 |
-삼 | -삼 | -삼 |
컨볼 브드 이미지 (Kirsch South West)

Robinson 나침반 마스크는 가장자리 감지에 사용되는 또 다른 유형의 파생 마스크입니다. 이 연산자는 방향 마스크라고도합니다. 이 연산자에서 우리는 하나의 마스크를 가져 와서 8 개의 주요 방향으로 회전시켜 8 개의 방향의 가장자리를 얻습니다.
우리는 사용할 것입니다 OpenCV 함수 filter2DRobinson 연산자를 이미지에 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 및 설명 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. Point (-1, -1) 위치는 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 Robinson 연산자를 Grayscale 이미지에 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지는 아래와 같이 North Edge의 Robinson 연산자와 컨볼 루션됩니다.
북쪽 방향 마스크
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
컨볼 브드 이미지 (Robinson North)

이 원본 이미지는 또한 아래에 주어진 것과 같이 동쪽 가장자리의 Robinson 연산자와 결합되었습니다.
동쪽 방향 마스크
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Convolved Image (Robinson East)

라플라시안 연산자는 또한 이미지에서 가장자리를 찾는 데 사용되는 미분 연산자입니다. Laplacian과 Prewitt, Sobel, Robinson 및 Kirsch와 같은 다른 연산자의 주요 차이점은 모두 1 차 미분 마스크이지만 Laplacian은 2 차 미분 마스크라는 것입니다.
우리는 사용 OpenCV 함수 filter2DLaplacian 연산자를 이미지에 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | depth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. 위치 점 (-1, -1)은 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 회색조 이미지에 Laplacian 연산자를 적용하기 위해 Imgproc 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지는 아래와 같이 Laplacian Negative 연산자와 컨볼 루션됩니다.
라플라시안 네거티브
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Convolved Image (Laplacian Negative)

이 원본 이미지는 아래와 같이 Laplacian Positive 연산자로 컨볼 루션됩니다.
라플라시안 양성
0 | 1 | 0 |
1 | -4 | 1 |
0 | 1 | 0 |
컨볼 브드 이미지 (라플라시안 양성)

가중 평균 필터에서 중앙 값에 더 많은 가중치를 부여하여 중앙의 기여도가 나머지 값보다 커집니다. 가중 평균 필터링으로 인해 이미지의 흐림을 제어 할 수 있습니다.
우리는 사용 OpenCV 함수 filter2D가중 평균 필터를 이미지에 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
함수 인수는 아래에 설명되어 있습니다.
Sr. 아니. | 인수 및 설명 |
---|---|
1 | src 소스 이미지입니다. |
2 | dst 목적지 이미지입니다. |
삼 | ddepth dst의 깊이입니다. 음수 값 (예 : -1)은 깊이가 소스와 동일 함을 나타냅니다. |
4 | kernel 이미지를 통해 스캔되는 커널입니다. |
5 | anchor 커널과 관련된 앵커의 위치입니다. Point (-1, -1) 위치는 기본적으로 중심을 나타냅니다. |
6 | delta 컨볼 루션 중에 각 픽셀에 추가되는 값입니다. 기본적으로 0입니다. |
7 | BORDER_DEFAULT 기본적으로이 값을 사용합니다. |
filter2D () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Graycale 이미지에 가중치 평균 필터를 적용하기 위해 Imgproc 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

이 원본 이미지는 아래와 같이 가중 평균 필터와 연결됩니다.
가중 평균 필터
1 | 1 | 1 |
1 | 10 | 1 |
1 | 1 | 1 |
컨볼 브드 이미지

확대 / 축소는 이미지를 확대하여 이미지의 세부 사항이 더 잘 보이고 눈에 띄도록하는 과정입니다.
우리는 사용 OpenCV 함수 resize이미지에 확대 / 축소를 적용합니다. 아래에서 찾을 수 있습니다.Imgproc꾸러미. 구문은 다음과 같습니다.
Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);
크기 조정 기능에서 소스 이미지, 대상 이미지 및 해당 크기, 확대 / 축소 비율 및 사용할 보간 방법을 전달합니다.
사용 가능한 보간 방법은 다음과 같습니다.
Sr. 아니. | 보간 방법 및 설명 |
---|---|
1 | INTER_NEAREST 가장 가까운 이웃 보간입니다. |
2 | INTER_LINEAR 쌍 선형 보간 (기본적으로 사용됨)입니다. |
삼 | INTER_AREA 픽셀 영역 관계를 사용한 리샘플링입니다. 더 자유로운 결과를 제공하므로 이미지 데시 메이션에 선호되는 방법 일 수 있습니다. |
4 | INTER_CUBIC 4x4 픽셀 이웃에 대한 바이 큐빅 보간입니다. |
5 | INTER_LANCZOS4 8x8 픽셀 이웃에 대한 Lanczos 보간입니다. |
크기 조정 방법 외에도 Imgproc 클래스에서 제공하는 다른 방법이 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제에서는 Imgproc 클래스를 사용하여 이미지에 확대 / 축소를 적용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 코드를 실행하면 다음 출력이 표시됩니다.
원본 이미지

확대 된 이미지 (Zooming factor − 2)
이 장에서는 널리 사용되고 프로젝트에 쉽게 통합 될 수있는 무료 이미지 처리 라이브러리 중 일부를 살펴 봅니다. 이 라이브러리에는 다음이 포함됩니다.
- ImageJ
- Fiji
- 커먼즈 이미징
- ImageMagick
- Endrov
- LeadTools
- OpenCv
ImageJ
ImageJ는 Macintosh 용 NIH Image에서 영감을받은 공용 도메인 Java 이미지 처리 프로그램입니다. 8 비트, 16 비트 및 32 비트 이미지를 표시, 편집, 분석, 처리, 저장 및 인쇄 할 수 있습니다.
ImageJ의 기본 기능 중 일부는 아래에 설명되어 있습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Runs Everywhere ImageJ는 Java로 작성되어 Linux, Mac OS X 및 Windows에서 32 비트 및 64 비트 모드로 실행할 수 있습니다. |
2 | Open Source ImageJ 및 Java 소스 코드는 무료로 사용할 수 있으며 공개 도메인에 있습니다. |
삼 | Toolkit ImageJ를 이미지 처리 툴킷 (클래스 라이브러리)으로 사용하여 애플릿, 서블릿 또는 애플리케이션을 개발하십시오. |
4 | Data Types 8 비트 회색조 또는 인덱스 색상, 16 비트 부호없는 정수, 32 비트 부동 소수점 및 RGB 색상. |
5 | File Formats GIF, JPEG, BMP, PNG, PGM, FITS 및 ASCII를 열고 저장합니다. DICOM을 엽니 다. URL을 사용하여 TIFF, GIF, JPEG, DICOM 및 원시 데이터를 엽니 다. |
6 | Selections 직사각형, 타원형 또는 불규칙한 영역 선택을 만듭니다. 선과 점 선택을 만듭니다. |
7 | Image Enhancement 8 비트 그레이 스케일 및 RGB 컬러 이미지 모두에서 평활화, 선명하게하기, 가장자리 감지, 중앙값 필터링 및 임계 값을 지원합니다. |
8 | Color Processing 32 비트 컬러 이미지를 RGB 또는 HSV 구성 요소로 분할합니다. 8 비트 구성 요소를 컬러 이미지로 병합합니다. |
피지
피지는 이미지 처리 패키지입니다. 이것은 Java, Java3D 및 일관된 메뉴 구조로 구성된 많은 플러그인과 함께 ImageJ (및 ImageJ2)의 배포로 설명 될 수 있습니다. 피지는 Ubuntu가 Linux와 비교할 때 ImageJ와 비교됩니다.
ImageJ 기본 기능 외에도 피지의 일부 고급 기능이 아래에 설명되어 있습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Registering 3D images 여기에는 Elastic Alignment 및 Montage, Feature Extraction, Image Stabilizer 등이 포함됩니다. |
2 | Segmenting images 35 개 이상의 세분화 유형을 제공합니다. |
삼 | Useful keyboard short cuts Fuji에는 많은 키보드 단축키가 있습니다. |
4 | Scripting JavaScript, JRuby, Jython, Clojure 및 Beanshell에서 매크로로 스크립팅을 허용합니다. |
5 | Developing Plug-ins 스크립트 편집기를 사용하여 플러그인 개발을 시작한 다음 플러그인을 실행하십시오. |
6 | ImageJ Tricks ImageJ는 사용하기 쉽지만 때때로 실제로 구현 된 일부 기능을 원하지만 트리거 방법을 모릅니다. |
커먼즈 이미징
이전에 Apache Commons Sanselan으로 알려진 Apache Commons Imaging은 (크기, 색상, 공간, ICC 프로파일 등) 및 메타 데이터와 같은 이미지 정보의 빠른 구문 분석을 포함하여 다양한 이미지 형식을 읽고 쓰는 라이브러리입니다.
ImageJ의 기본 기능 중 일부는 아래에 설명되어 있습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Java Apache Commons Imaging은 100 % 순수 Java로 작성되었습니다. 수정없이 모든 JVM 및 모든 플랫폼에서 실행됩니다. |
2 | Image Formats 다양한 이미지 형식을 읽고 쓰고, 모든 또는 대부분의 다른 라이브러리에서 누락 된 일부 변형 및 인코딩을 지원합니다. |
삼 | Metadata support EXIF 메타 데이터를 포함하여 구조화 된 방식으로 다양한 메타 데이터 읽기 및 쓰기를 지원합니다. |
4 | Network Friendly 네트워크 친화적입니다. Commons Imaging은 필요한 데이터 만 읽고 읽은 데이터를 캐시하여 네트워크에서 너무 무겁지 않게합니다. |
5 | Easy to use 사용하기 매우 쉽게 설계되었습니다. 간단하고 깔끔한 인터페이스를 가지고 있습니다. 대부분의 작업은 단일 이미징 메서드 호출입니다. |
6 | Transparent Commons Imaging은 투명성을 목표로합니다. 폐기 할 숨겨진 버퍼, 해제 할 기본 메모리, 백그라운드 스레드가 없습니다. |
7 | Open Source 자유 소프트웨어 / 오픈 소스입니다. Apache 소프트웨어 라이선스에 따라 사용할 수 있습니다. |
8 | Color Conversions ColorConversions 클래스는 CIE-L * CH, CIE-L * ab, CIE-L * uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ 및 YXY와 같은 색 공간간에 변환하는 메서드를 제공합니다. |
ImageMagick
ImageMagick은 비트 맵 이미지를 생성, 편집, 구성 또는 변환하는 소프트웨어 제품군입니다. DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG, TIFF 등 100 개 이상의 형식으로 이미지를 읽고 쓸 수 있습니다. ImageMagick을 사용하여 이미지의 크기를 조정, 뒤집기, 대칭, 회전, 왜곡, 기울이기 및 변형하고, 이미지 색상을 조정하고, 다양한 특수 효과를 적용하거나, 텍스트, 선, 다각형, 타원 및 베 지어 곡선을 그립니다.
ImageMagick의 기본 기능 중 일부는 다음과 같습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Format conversion 이미지를 한 형식에서 다른 형식으로 변환합니다 (예 : PNG에서 JPEG로). |
2 | Transform 이미지 크기를 조정, 회전, 자르기, 뒤집기 또는 트리밍 할 수 있습니다. |
삼 | Transparency 이미지의 일부를 보이지 않게 렌더링합니다. |
4 | Draw 이미지에 도형이나 텍스트를 추가합니다. |
5 | Decorate 이미지에 테두리 또는 프레임을 추가합니다. |
6 | Special effects 이미지를 흐리게, 선명하게, 임계 값 또는 색조로 만들 수 있습니다. |
7 | Animation 이미지 그룹에서 GIF 애니메이션 시퀀스를 만들 수 있습니다. |
8 | Composite 한 이미지를 다른 이미지 위에 겹칠 수 있습니다. |
9 | Morphology of shapes 특징을 추출하고 모양을 설명하며 이미지의 패턴을 인식합니다. |
10 | Encipher or decipher an image 평범한 이미지를 이해할 수없는 횡설수설로 변환하고 다시 되돌립니다. |
Endrov
Endrov는 다목적 이미지 분석 프로그램입니다. 그것은 독립적으로 작성되었으며 다른 자유 소프트웨어 및 많은 상용 패키지의 많은 단점을 해결하도록 설계되었습니다.
Endrov의 기본 기능 중 일부는 다음과 같습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | View data 2D 및 3D로 데이터를 봅니다. 복잡한 4D 데이터 체계와 무제한 수의 채널을 처리하도록 설계되었으며 각 채널은 고유 한 X, Y 및 Z 해상도를 가질 수 있습니다. |
2 | Annotate your images 자동 또는 손으로 이미지에 주석을 달아 이미지를 이해하고 통계를 얻습니다. |
삼 | Undo and Redo 모든 작업을 실행 취소하고 다시 실행할 수 있습니다. |
4 | Lazy Evaluation 대형 이미지 세트를 처리하도록 지상에서 설계되었습니다. Endrov는 주로 연구 프로그래밍 언어에서 사용할 수있는 개념 인 지연 평가를 사용합니다. |
5 | Scripting language 그래픽 스크립팅 언어와 전통적인 스크립팅을 지원합니다. |
6 | Java Java로 작성되었습니다. 플러그인 아키텍처를 통해 새로운 Java 플러그인으로 쉽게 확장 할 수 있습니다. Matlab과 상호 작용할 수 있습니다. |
7 | Formats Bio-formats를 사용하여 거의 모든 상용 및 공개 파일 형식에 액세스합니다. |
8 | Microscopic Processing 하나의 프로그램으로 모든 현미경을 제어하고 즉시 이미지 분석을 수행 할 수 있습니다. |
LEADTOOLS
LEADTOOLS는 문서 정리, 의료 이미지 향상, 색상 변환 및 보정, 노이즈 감소, 가장자리 감지 등 여러 범주에서 200 개 이상의 이미지 처리 기능을 제공합니다.
LEADTOOLS의 기본 기능 중 일부는 다음과 같습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Scanned Document Image Processing 이 강력한 기능 모음은 천공 구멍, 기울어 진 각도, 테두리, 먼지 얼룩 등과 같은 인공물 및 결함의 스캔 문서를 읽을 수 있습니다. |
2 | Medical Image Processing 더 나은 비주얼을 위해 배경을 이동, 선택, 제거 및 제거하여 이미지를 향상 시키거나 세부 사항을 강조합니다. |
삼 | Geometric Transformation 이러한 기능은 이미지를 정리, 정렬, 수정하거나 예술적 3D 효과를 적용하는 데 사용할 수 있습니다. |
4 | Brightness and Contrast 이러한 기능은 이미지를 향상 시키거나 예술적 효과를 적용하거나 의료 이미지의 진단 평가를 지원하는 데 사용할 수 있습니다. |
5 | Color Space Conversion IIS 및 Windows WF 호스팅 응용 프로그램을 포함한 단일 및 다중 스레드 응용 프로그램에 이미지 색 공간 기능을 추가 할 수 있습니다. |
6 | Color Correction 이러한 기능은 스왑 된 색상 채널로 이미지를 수정하거나 색상 강도의 균형을 맞추거나 다양한 이미지 분석 작업을 수행하는 데 사용됩니다. |
7 | Image Enhancement 이러한 기능은 적목 현상 및 색상 불균형과 같은 사진의 일반적인 오류를 수정하고 의료 영상의 진단 평가를 지원하는 데 사용됩니다. |
8 | Region of Interest 이러한 기능은 이미지의 관심 영역을 생성 및 수정하여 이미지의 특정 부분에 대한 이미지 처리 기능을 수행하고 바코드 및 OCR 인식 시간을 절약하거나 다양한 이미지 분석 작업을 수행하는 데 사용됩니다. |
OpenCV
OpenCV는 BSD 라이선스에 따라 릴리스되므로 학술 및 상업적 사용 모두 무료입니다. C ++, C, Python 및 Java 인터페이스가 있으며 Windows, Linux, Mac OS, iOS 및 Android를 지원합니다. OpenCV는 계산 효율성을 위해 설계되었으며 실시간 애플리케이션에 중점을 둡니다. 최적화 된 C / C ++로 작성된 라이브러리는 멀티 코어 처리를 활용할 수 있습니다.
OpenCV의 몇 가지 기본 기능이 간략하게 설명되어 있습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Smoothing Images 여기에는 Blur, GaussianBlur, medianBlur 및 양방향 필터 적용이 포함됩니다. |
2 | Eroding and Dilating 두 가지 매우 일반적인 형태 연산자 인 Dilation과 Erosion을 적용 할 수 있습니다. |
삼 | Morphology Transformations OpenCV 함수 morphologyEx는 열기, 닫기, TopHat 및 BlackHat 등과 같은 형태 적 변환을 적용합니다. |
4 | Image Pyramids OpenCV는 주어진 이미지를 다운 샘플링하거나 업 샘플링하기 위해 pyrUp 및 pyrDown 기능을 수행합니다. |
4 | Basic Thresholding Operations OpenCV 함수 임계 값을 사용하여 기본 임계 값 작업을 수행합니다. |
5 | Adding borders to your images OpenCV 함수 copyMakeBorder는 테두리를 설정하는 데 사용됩니다 (이미지에 추가 패딩). |
7 | Remapping OpenCV에서 함수 remap은 간단한 다시 매핑 구현을 제공합니다. |
8 | Histogram Calculation 간단한 목적으로 OpenCV는 배열 집합 (일반적으로 이미지 또는 이미지 평면)의 히스토그램을 계산하는 함수 calcHist를 구현합니다. 최대 32 차원으로 작동 할 수 있습니다. |
OpenCV는 BSD 라이선스에 따라 릴리스되므로 학술 및 상업적 사용 모두 무료입니다. C ++, C, Python 및 Java 인터페이스가 있으며 Windows, Linux, Mac OS, iOS 및 Android를 지원합니다.
OpenCV는 계산 효율성을 위해 설계되었으며 실시간 애플리케이션에 중점을 둡니다. 최적화 된 C / C ++로 작성된 라이브러리는 멀티 코어 처리를 활용할 수 있습니다.
OpenCV의 기본 기능 중 일부는 아래에 설명되어 있습니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Smoothing Images 여기에는 Blur, GaussianBlur, medianBlur 및 양방향 필터 적용이 포함됩니다. |
2 | Eroding and Dilating 두 가지 매우 일반적인 형태 연산자 인 Dilation과 Erosion을 적용 할 수 있습니다. |
삼 | Morphology Transformations OpenCV 함수 morphologyEx는 열기, 닫기, TopHat 및 BlackHat 등과 같은 형태 적 변환을 적용합니다. |
4 | Image Pyramids OpenCV는 주어진 이미지를 다운 샘플링하거나 업 샘플링하기 위해 pyrUp 및 pyrDown 기능을 수행합니다. |
4 | Basic Thresholding Operations OpenCV 함수 임계 값을 사용하여 기본 임계 값 작업을 수행 할 수 있습니다. |
5 | Adding borders to your images OpenCV 함수 copyMakeBorder는 테두리 (이미지에 추가 패딩)를 설정하는 데 사용됩니다. |
7 | Remapping OpenCV에서 함수 remap은 간단한 다시 매핑 구현을 제공합니다. |
8 | Histogram Calculation 간단한 목적으로 OpenCV는 배열 집합 (일반적으로 이미지 또는 이미지 평면)의 히스토그램을 계산하는 함수 calcHist를 구현합니다. 최대 32 차원으로 작동 할 수 있습니다. |
OpenCV 통합
다음 단계는 OpenCV를 애플리케이션에 통합하는 방법을 설명합니다.
OpenCV 다운로드
공식 웹 사이트 에서 OpenCV를 다운로드 할 수 있습니다 .
사용자 라이브러리 생성
또한 OpenCV의 사용자 라이브러리를 만들어 향후 프로젝트로 사용할 수 있습니다.
Eclipse 시작
메뉴에서 창-> 환경 설정을 선택하십시오.
Java-> 빌드 경로-> 사용자 라이브러리 아래로 이동하고 새로 작성을 클릭하십시오.
이제 라이브러리 이름을 입력하십시오. 예 : OpenCV-2.4.6.
그런 다음 새 사용자 라이브러리 (예 : OpenCV-2.4.6)를 선택하고 외부 JAR 추가를 클릭합니다.
C : \ OpenCV-2.4.6 \ build \ java \를 검색하고 opencv-246.jar를 선택합니다. jar를 추가 한 후 opencv-246.jar을 확장하고 Native library location을 선택하고 Edit를 누릅니다.
외부 폴더 ...를 선택하고 C : \ OpenCV-2.4.6 \ build \ java \ x64 폴더를 찾아 선택합니다. 32 비트 시스템을 사용하는 경우 x64 대신 x86 폴더를 선택해야합니다.
확인을 누르면 완료됩니다.
이제 사용자 라이브러리가 생성됩니다. 이제 모든 프로젝트에서이 구성을 재사용 할 수 있습니다.
OpenCV 프로젝트 만들기
Eclipse에서 새 Java 프로젝트를 만듭니다.
Java 설정 단계의 라이브러리 탭에서 라이브러리 추가 ...를 선택하고 OpenCV-2.4.6을 선택한 다음 마침을 클릭합니다.
완료를 클릭하면 완료됩니다.
OpenCV를 사용하여 컬러 이미지를 Grayscale 이미지로 변환하기 위해 이미지를 BufferedImage 그리고 그것을 Mat목적. 구문은 다음과 같습니다.
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
그런 다음 방법을 사용하여 이미지를 RGB에서 회색조 형식으로 변환 할 수 있습니다. cvtColor() 에 Imgproc수업. 구문은 다음과 같습니다.
Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);
방법 cvtColor() 소스 이미지 매트릭스, 대상 이미지 매트릭스 및 색상 변환 유형의 세 가지 매개 변수를 사용합니다.
cvtColor 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 그들은 아래에 나열되어 있습니다-
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 이미지를 그레이 스케일로 변환하기 위해 Imgproc 클래스를 사용하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 예제를 실행하면 이미지 이름을 변환합니다. digital_image_processing.jpg 동등한 그레이 스케일 이미지에 저장하고 이름으로 하드 디스크에 씁니다. grayscale.jpg.
원본 이미지

그레이 스케일 이미지

OpenCV를 사용하여 한 이미지의 색 공간을 다른 이미지로 변경하기 위해 이미지를 BufferedImage 그리고 그것을 Mat목적. 구문은 다음과 같습니다.
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
OpenCv는 많은 색상 변환 유형을 허용하며, 모두 Imgproc 클래스에서 찾을 수 있습니다. 일부 유형은 간략하게 설명되어 있습니다.
Sr. 아니. | 색상 변환 유형 |
---|---|
1 | COLOR_RGB2BGR |
2 | COLOR_RGB2BGRA |
삼 | COLOR_RGB2GRAY |
4 | COLOR_RGB2HLS |
5 | COLOR_RGB2HSV |
6 | COLOR_RGB2Luv |
7 | COLOR_RGB2YUV |
8 | COLOR_RGB2Lab |
색상 변환 유형 중 하나에서 적절한 것을 메소드에 전달하십시오. cvtColor() 에 Imgproc수업. 구문은 다음과 같습니다.
Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);
방법 cvtColor() 소스 이미지 매트릭스, 대상 이미지 매트릭스 및 색상 변환 유형의 세 가지 매개 변수를 사용합니다.
cvtColor () 메서드 외에도 Imgproc 클래스에서 제공하는 다른 메서드가 있습니다. 간단히 설명합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) 한 색상 공간에서 다른 색상 공간으로 이미지를 변환합니다. |
2 | dilate(Mat src, Mat dst, Mat kernel) 특정 구조 요소를 사용하여 이미지를 확장합니다. |
삼 | equalizeHist(Mat src, Mat dst) 회색조 이미지의 히스토그램을 동일하게합니다. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) 커널과 이미지를 컨볼 루션합니다. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) 가우시안 필터를 사용하여 이미지를 흐리게합니다. |
6 | integral(Mat src, Mat sum) 이미지의 적분을 계산합니다. |
예
다음 예제는 Imgproc 클래스를 사용하여 한 색상 공간에서 다른 색상 공간으로 이미지를 변환하는 방법을 보여줍니다.
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());
}
}
}
산출
주어진 예제를 실행하면 이미지 이름을 변환합니다. digital_image_processing.jpg 상응하는 HSV 색상 공간 이미지에 저장하고 이름으로 하드 디스크에 기록합니다. hsv.jpg.
원본 이미지 (RGB)

변환 된 이미지 (HSV)
