ずっと以下の質問に取り組んでいました.OpenCVは使っていないので先生からファイル読み込みの動作をプログラミングすればいいとのことでしたが、C++やJavaで画像ファイルを読み込む方法がわかりません.ここに私にとっての問題があります. ファイルを読んだ後, 写真のピクセルを処理する方法がわからないことがわかったとき. これは別の新しい問題です. したがって、これら2つの問題の後、私は自分の知識の盲点、つまりマスターしなければならないことに触れて、それが私の勉強に大いに役立っている問題の理由が私を惹きつけ、学習を続けるモチベーションを与えてくれるだから、誰もが自分の好きなことを見つけなければならない、あなたはそれに興味があるので、あなたは率先して彼を探求し、さらに先へ進み、新たな高みに到達し、あなた自身の心のヒーローになります.
方法 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();
}
}
整然としたディザリングでは、この画像を元のグレースケール画像として引き続き使用します
プログラムを実行した後、整然としたディザリング後に得られた画像は
簡単な説明:
この 2 つのプログラムは idea で実行しています. Eclipse で問題なく動作するかどうかはわかりません. 学生の場合, idea は無料で使用できます. こちらの https://blog.csdn.net/ xiatutut/ を参照してください. article/details/126632928ですが、学生でなくてもeclipseで問題が発生した場合は、問題の原因を確認するか、アイデアを使用することしかできません。