이미지 디더링(무작위 노이즈 추가 + 매트릭스 순서 디더링) Java 구현, OpenCV 사용하지 않음 강의실에서 가르치는 두 가지 디더링(Dithering) 방법에 따라 직접 프로그래밍하여 구현합니다(프로그래밍 언어는 제한 없음). 구현 방법 1: 랜덤 노이즈를 추가하여 정보 유지

오래전부터 다음 질문에 대한 연구를 하고 있는데 선생님이 OpenCV를 사용하지 않는다고 하셔서 파일을 읽는 동작은 프로그래밍을 해야 할 것 같은데 C++나 자바로 이미지 파일을 어떻게 읽어야 하는지 모르겠어서, 그래서 여기에 문제가 있습니다. 문제는 파일을 읽은 후 사진의 픽셀을 처리하는 방법을 몰랐다는 것을 알았을 때 이것은 또 다른 새로운 문제입니다. 따라서 이 두 가지 문제 후에 저는 왔습니다. 내 자신의 지식 사각지대, 즉 마스터가 필요하다 이것은 내 공부에 큰 도움이 되었다 문제의 원인이 나를 끌어당기고 계속 공부할 동기를 준다 따라서 모두가 좋아하는 것을 찾아야 한다 , 당신이 그것에 관심이 있기 때문에 당신은 그를 탐구하기 위해 주도권을 잡을 것입니다. 그래서 당신은 더 멀리 가고 새로운 높이에 도달하고 당신 자신의 마음 속의 영웅이 될 것입니다.

여기에 이미지 설명 삽입

방법 1: 임의 노이즈 추가

랜덤 노이즈를 추가하는 방법은 다음과 같이 이해할 수 있습니다.
이미지를 신호로 간주하면 노이즈가 간섭 신호입니다. 이미지를 수집할 때 다양한 간섭으로 인해 이미지 노이즈가 발생할 수 있습니다.
그러면 이미지를 함수로 간주할 수 있고 노이즈가 있는 이미지는 원본 이미지 함수와 노이즈 함수의 합으로 간주할 수 있습니다.
f(x,y) = I(x,y)+잡음      ~~~~    //여기서 노이즈는 프로그램에서 매개변수가 없는 함수로 간주할 수 있습니다.

import java.io.*;
import java.util.*;
import java.security.cert.PolicyNode;
import java.lang.StringBuffer;
import java.util.HashMap;
import java.util.Map.Entry;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Main {
    
    
    private BufferedImage original;
    private void readOriginal() {
    
    
        File f=new File("original.jpg");//这里新创建了一个对象叫 original.jpg 的文件
        try{
    
    //读取图片
            original=ImageIO.read(f);//然后来到当前目录下面去找是否有这个文件,所以要先在当前文件夹中复制一个名为 original.jpg 的文件,这样才可以找到
        } catch (IOException e) {
    
    //如果找不到这个图片则抛出异常
            e.printStackTrace();
        }
    }
    private double randomNoise(){
    
    //产生随机噪声
        return (Math.random()-0.5)*3;//返回从-0.5到0.5的一个随机值
    }
    private void dither(){
    
    
        BufferedImage imRes=new BufferedImage(original.getWidth(),
                original.getHeight(),BufferedImage.TYPE_INT_RGB);
        int n=original.getWidth();//图像的宽度
        int m=original.getHeight();//长度
        for(int i=0;i<n;++i){
    
    
            for(int j=0;j<m;++j)
                imRes.setRGB(i,j,original.getRGB(i,j)+(int)(randomNoise()));//这里就是上面文字的解释,在原像素值的基础上加入一些随机值,即加入随机噪声
        }
        try{
    
    //如果成功实现抖动,就保存图片到当前文件夹下
            ImageIO.write(imRes,"PNG",new File("result.jpg"));//保存该文件,类型为jpg
        }
        catch(IOException e){
    
    //否则抛出异常
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
    
    
        Main d=new Main();
        d.readOriginal();
        d.dither();
    }
}

다음은 주로 파일이 저장되는 위치를 설명합니다.
먼저 프로그램이 실행되기 전에 이름이 지정된 폴더가 있어야 합니다.원본.jpg물론 파일 형식은 jpg여야 합니다.
여기에 이미지 설명 삽입
예를 들어 처음에 넣은 원본 그레이스케일 이미지는 이것, 즉원본.jpg
사진 설명을 추가해주세요

폴더 아래에 그림이 있으면 프로그램을 실행할 수 있으며 성공적인 실행 후 새 프로그램이 생성됩니다.결과.jpg임의의 노이즈를 추가한 후의 그림은 다음과 같습니다.

사진 설명을 추가해주세요

디더링을 달성하기 위해 임의의 노이즈를 추가하는 것으로 충분합니다.

방법 2: 순서대로 디더링

정렬된 지터의 파일 읽기 및 쓰기는 임의 노이즈를 추가하는 것과 유사하므로 여기서 소개에 집중할 필요가 없습니다.정렬된 지터의 원리는 다음과 같습니다.

import java.io.*;
import java.util.*;
import java.security.cert.PolicyNode;
import java.util.Scanner;//输入头文件
import java.util.Arrays;//引入数组类
import java.lang.StringBuffer;
import java.util.HashMap;
import java.util.Map.Entry;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Main {
    
    
    private BufferedImage original;
    //4*4抖动矩阵
    private  double mat[][]={
    
    {
    
    0,8,2,10},{
    
    12,4,14,6},{
    
    3,11,1,9},{
    
    15,7,13,5}};
    private void readOriginal() {
    
    
        File f=new File("original.jpg");
        try{
    
    //读取图片
            original=ImageIO.read(f);
        } catch (IOException e) {
    
    //如果找不到这个图片则抛出异常
            e.printStackTrace();
        }
    }
    private void dither() {
    
    
        BufferedImage imRes=new BufferedImage(original.getWidth(),
                original.getHeight(),BufferedImage.TYPE_INT_RGB);
        int n=original.getWidth();//图像的宽度
        int m=original.getHeight();//长度
        for(int i=0;i<n;++i){
    
    
            for(int j=0;j<m;++j){
    
    
                int color=original.getRGB(i,j);
                int red=(color>>>16)&0xFF;
                int green=(color>>>8)&0xFF;
                int blue=(color>>>0)&0xFF;
                double lum=(red+green+blue)/255;
                if(lum>mat[i%4][j%4])
                    imRes.setRGB(i,j,0xFFFFFF);
                else
                    imRes.setRGB(i,j,0x000000);
            }
        }
        try{
    
    //如果成功实现抖动,就保存图片到当前文件夹下
            ImageIO.write(imRes,"PNG",new File("result.png"));//最后保存图片类型为png
        }
        catch(IOException e){
    
    //否则抛出异常
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
    
    
        Main d=new Main();
        d.readOriginal();
        d.dither();
    }
}

질서 있는 디더링에서 우리는 여전히 이 그림을 원래의 회색조 이미지로 사용합니다.
사진 설명을 추가해주세요

프로그램 실행 후 순차적으로 디더링하여 얻은 이미지는

사진 설명을 추가해주세요


간단한 설명:
저는 이 두 프로그램을 idea로 실행하고 있습니다.Eclipse에서 실행하는데 문제가 있을지 모르겠습니다.학생분들은 idea를 무료로 사용하실 수 있습니다.https: //blog.csdn.net/xiatutut/ 를 참고하시면 됩니다. article/details/126632928 , 하지만 학생이 아닌 경우 eclipse에 문제가 있는 경우 문제의 원인을 확인하거나 아이디어를 사용할 수 있습니다.



추천

출처blog.csdn.net/xiatutut/article/details/127836617