图像处理Java代码-椒盐噪声、胡椒噪声、盐噪声

图像处理-椒盐噪声、胡椒噪声、盐噪声

package com.ydfind.image.biz.util;

import com.ydfind.image.util.ImgUtils;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

/**
 * 椒盐噪声 service
 * @author ydfind
 */
@Component
@Service
public class PepperSaltNoiseProcessor extends ImageProcessor {

    public static final String PEPPER_SALT_NOISE_NAME = "椒盐噪声";

    public static final String PEPPER_NOISE_NAME = "胡椒噪声";

    public static final String SALT_NOISE_NAME = "盐噪声";

    /**
     * 添加椒盐噪声:根据信噪比,随机把点设置为0或1
     * @param srcImg 原图
     * @param trgImg 目标图像
     * @param param 信噪比
     * @param type 椒盐,椒,盐
     */
    public static void addPepperSaltNoise(BufferedImage srcImg, BufferedImage trgImg, double param, String type){
        int total = srcImg.getWidth() * srcImg.getHeight();
        int count = new Double(total * (1 - param)).intValue();
        Random random = new Random();
        for(int i = 0; i < count; i++) {
            int randomX = random.nextInt(srcImg.getWidth());
            int randomY = random.nextInt(srcImg.getHeight());
            int[] channels = ImgUtils.getChannelColor(srcImg, randomX, randomY);
            int newColor;
            if(PEPPER_SALT_NOISE_NAME.equals(type)){
                newColor = (random.nextInt(2) + 1) % 2 == 0 ? 0 : 255;
            }else if(PEPPER_NOISE_NAME.equals(type)){
                newColor = 0;
            }else{
                newColor = 255;
            }
            for(int k = ImgUtils.COLOR_CHANNEL_COUNT - 1; k > 0; k--){
                channels[k] = newColor;
            }
            int color = ImgUtils.colorToRgb(channels);
            trgImg.setRGB(randomX, randomY, color);

        }
    }

    /**
     * 添加椒盐噪声:根据信噪比,随机把点设置为0或1
     * @param srcFilename 原图
     * @param trgFilename 目标图像
     * @param param 信噪比
     * @throws IOException 报错
     */
    public static void addPepperSaltNoise(String srcFilename, String trgFilename, double param) throws IOException {
        BufferedImage srcImg = ImageIO.read(new File(srcFilename));
        BufferedImage trgImg = ImgUtils.copyImage(srcImg);
        addPepperSaltNoise(srcImg, trgImg, param, PEPPER_SALT_NOISE_NAME);
        ImgUtils.saveImage(trgFilename, trgImg);
    }

    /**
     * 添加椒盐噪声:根据信噪比,随机把点设置为0或1
     * @param srcFilename 原图
     * @param trgFilename 目标图像
     * @param param 信噪比
     * @param type 0椒盐,1椒,2盐
     * @throws IOException 报错
     */
    public static void addNoise(String srcFilename, String trgFilename, double param, String type) throws IOException {
        BufferedImage srcImg = ImageIO.read(new File(srcFilename));
        BufferedImage trgImg = ImgUtils.copyImage(srcImg);
        addPepperSaltNoise(srcImg, trgImg, param, type);
        ImgUtils.saveImage(trgFilename, trgImg);
    }
}
/**
     * 获取图像指定位置的grb
     * @param img 图像
     * @param x x位置
     * @param y y位置
     * @return agrb颜色值
     */
    public static int[] getChannelColor(BufferedImage img, int x, int y){
        int color = img.getRGB(x, y);
        int[] channels = new int[4];
        for(int k = ImgUtils.COLOR_CHANNEL_COUNT - 1; k >= 0; k--){
            channels[k] = color & 0xff;
            color >>= 8;
        }
        return channels;
    }

测试类如下:

/**
     * 胡椒噪声
     */
    public void pepperAndReHarmonicFilter(double param) throws IOException {
        String src = Constant.TEST_IMAGE_DIR + "5/5-1-512x512.png";
        String trg = FileUtils.suffixToFilename(src, "-pepper-" + param);
        PepperSaltNoiseProcessor.addNoise(src, trg, param, PepperSaltNoiseProcessor.PEPPER_NOISE_NAME);
    }

    /**
     * 盐噪声
     */
    public void salt(double param) throws IOException {
        String src = Constant.TEST_IMAGE_DIR + "5/5-1-512x512.png";
        String trg = FileUtils.suffixToFilename(src, "-salt-" + param);
        PepperSaltNoiseProcessor.addNoise(src, trg, param, PepperSaltNoiseProcessor.SALT_NOISE_NAME);
    }
    /**
     * 文件名称 添加后缀
     * @param filename 原文件名称 old.png
     * @param suffix 后缀 -suffix
     * @return 新文件名称old-suffix.png
     */
    public static String suffixToFilename(String filename, String suffix){
        if(filename.indexOf(FILE_JOIN_MARK) == -1) {
            return "";
        }
        int dotIndex = filename.lastIndexOf(FILE_JOIN_MARK);
        String result = filename.substring(0, dotIndex) + suffix + filename.substring(dotIndex, filename.length());
        return result;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为给图片添加椒盐噪声,可以按照以下步骤进行: 1. 首先,需要加载图片,并将其转换为灰度图像。 2. 然后,通过随机生成像素坐标的方式,为图像的一部分添加噪声。可以使用rand()函数生成随机数,并根据随机数的值来决定是将像素设置为黑色还是白色。 3. 最后,将添加噪声后的图像保存到文件中。 以下是示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <opencv/cv.h> #include <opencv/highgui.h> int main(int argc, char** argv) { if (argc != 2) { printf("Usage: %s <image>\n", argv[0]); return -1; } // 加载图像 IplImage* img = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE); if (!img) { printf("Unable to load image %s\n", argv[1]); return -1; } // 添加椒盐噪声 srand(time(NULL)); for (int i = 0; i < img->height * img->width / 10; i++) { int x = rand() % img->width; int y = rand() % img->height; int value = rand() % 2 == 0 ? 0 : 255; CV_IMAGE_ELEM(img, uchar, y, x) = value; } // 保存图像 cvSaveImage("noisy_image.jpg", img); // 释放图像 cvReleaseImage(&img); return 0; } ``` 要给图像添加高斯噪声,可以使用OpenCV的GaussianBlur函数。以下是示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <opencv/cv.h> #include <opencv/highgui.h> int main(int argc, char** argv) { if (argc != 2) { printf("Usage: %s <image>\n", argv[0]); return -1; } // 加载图像 IplImage* img = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE); if (!img) { printf("Unable to load image %s\n", argv[1]); return -1; } // 添加高斯噪声 cvSmooth(img, img, CV_GAUSSIAN, 5, 5, 0, 0); // 保存图像 cvSaveImage("noisy_image.jpg", img); // 释放图像 cvReleaseImage(&img); return 0; } ``` 要给图像添加胡椒噪声,可以按照添加椒盐噪声的方式进行,只不过需要将像素设置为黑色的概率增加。 要给图像添加噪声,可以按照添加椒盐噪声的方式进行,只不过需要将像素设置为白色的概率增加

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值