質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.82%

  • Java

    12543questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

BufferedImageのnoiseを取除く

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 49

wangzj

score 9

QRコードのnoiseを取除きたいですが、
ぐぐるで検索してみたら、いくつかのメソッドがあったんですが
試してみると、だめでした!
問題はどこかを教えていただけますでしょうか?
ほか、いいメソッドがあれば、ぜひご教授ください。

イメージ説明
メソッド1
※このメソッドはnoise取除きではなく、追加ですね
※調査してわかったことを追記

public static BufferedImage scale(BufferedImage src, int w, int h)
    {
      BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
      int x, y;
      int ww = src.getWidth();
      int hh = src.getHeight();
      for (x = 0; x < w; x++) {
        for (y = 0; y < h; y++) {
          int col = src.getRGB(x * ww / w, y * hh / h);
          img.setRGB(x, y, col);
        }
      }
      return img;
    }

メソッド2
※このメソッドはnoise取除きではなく、追加ですね
※調査してわかったことを追記

    public static BufferedImage impulseNoise(BufferedImage image, BufferedImage output) {
        output.setData(image.getData());

        Raster source = image.getRaster();
        WritableRaster out = output.getRaster();
        double impulseRatio = 0.05;
        double rand;
        double halfImpulseRatio = impulseRatio / 2.0;
        int bands  = out.getNumBands();
        int width  = image.getWidth();  // width of the image
        int height = image.getHeight(); // height of the image
        java.util.Random randGen = new java.util.Random();

        for (int j=0; j<height; j++) {
            for (int i=0; i<width; i++) {
                rand = randGen.nextDouble();
                if (rand < halfImpulseRatio) {
                    for (int b=0; b<bands; b++) out.setSample(i, j, b, 0);
                } else if (rand < impulseRatio) {
                    for (int b=0; b<bands; b++) out.setSample(i, j, b, 255);
                }
            }
        }

        return output;
    }

メソッド3

    protected static BufferedImage gaussianNoise(BufferedImage image, BufferedImage output) {
        Raster source = image.getRaster();
        WritableRaster out = output.getRaster();

        double stdDev = 10.0;
        int currVal;                    // the current value
        double newVal;                  // the new "noisy" value
        double gaussian;                // gaussian number
        int bands  = out.getNumBands(); // number of bands
        int width  = image.getWidth();  // width of the image
        int height = image.getHeight(); // height of the image
        java.util.Random randGen = new java.util.Random();

        for (int j=0; j<height; j++) {
            for (int i=0; i<width; i++) {
                gaussian = randGen.nextGaussian();

                for (int b=0; b<bands; b++) {
                    newVal = stdDev * gaussian;
                    currVal = source.getSample(i, j, b);
                    newVal = newVal + currVal;
                    if (newVal < 0)   newVal = 0.0;
                    if (newVal > 255) newVal = 255.0;

                    out.setSample(i, j, b, (int)(newVal));
                }
            }
        }

        return output;
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

汎用的なプログラムではありませんが、どうでしょうか。

static final int 黒 = 0xFF000000;
static final int 白 = 0xFFFFFFFF;
static final int 中間色 = 0xFF808080;
static final int[][] 近傍 = {
    {-1, 0}, // 左
    {0, -1}, // 上
    {1,  0}, // 右
    {0,  1}, // 下
};
static final int 近傍数 = 近傍.length;

public static void removeNoise(File in, File out) throws IOException {
    BufferedImage image = ImageIO.read(in);
    int width = image.getWidth();
    int height = image.getHeight();
    for (int x = 0; x < width; ++x) {
        for (int y = 0; y < height; ++y) {
            int black = 0;
            int white = 0;
            int org = image.getRGB(x, y);
            for (int i = 0; i < 近傍数; ++i) {
                int xi = x + 近傍[i][0], yi = y + 近傍[i][1];
                if (xi < 0 || xi >= width) continue;
                if (yi < 0 || yi >= height) continue;
                if (image.getRGB(xi, yi) > 中間色)
                    ++white;
                else
                    ++black;
            }
            if (black == white)
                image.setRGB(x, y, org > 中間色 ? 白 : 黒);
            else
                image.setRGB(x, y, black > white ? 黒 : 白);
        }
    }
    ImageIO.write(image, "png", out);
}

結果はこうなります。

処理結果のイメージ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/13 19:13

    さすが!!!!!!!!!!!!!
    QRコードを読み取れました!!!
    ありがとうございました!!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Java リストの使いかたについて

    リストの中で1番面積が大きい図形を返す Javaのコードでmaxの中身が分かりません。  リストの使いかたがいまいち分からず、、、教えてください。 該当のソースコード p

  • 解決済

    00

    oooooooooooooooooooooooooooooooooooooooo

  • 受付中

    【Java】画像のリサイズについて

    Javaを用いて画像のリサイズを行いたいです。 現状はリサイズはできているのですが、 リサイズ後の画質が悪く、画質の劣化が少ない方法を探しております。 リサイズの参考にし

  • 解決済

    java eclipseについて

    java eclipseでスライドパズルを作成しています。 9枚の画像で作成しており、現在は9枚の画像を実行するたびにランダムで表示するところまでいきました。 その後ですが9枚

  • 受付中

    JAVAのエラーの解決方法がわからないです

    以下のコードでコンパイルすると以下のエラーが出ます どのようにしたら解決できるでしょうか 解決策の回答をしくお願いします package home.tugame; impor

同じタグがついた質問を見る

  • Java

    12543questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。