OpenCV学习(五)之操作像素

package Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import tool.ShowImage;

public class Section2 {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        Mat image = Imgcodecs.imread("./images/1.jpg");
        Mat result = new Mat();

        exam7(image, result);

    }

    static void exam1() {
        Mat image = Imgcodecs.imread("./images/1.jpg");
        salt(image, 3000);
        new ShowImage(image);

        // double[] ds = image.get(10, 20);//访问图像的某个元素点
        // System.out.println("返回的数组的长度,即通道的数量:"+ds.length);
        // System.out.println(ds[0]+" "+ds[1] +" "+ds[2]);
    }

    static void salt(Mat image, int n) {
        int i, j;
        for (int k = 0; k < n; k++) {
            // rand() 是随机数
            Random random = new Random();
            i = random.nextInt(1000) % image.cols();
            j = random.nextInt(1000) % image.rows();

            if (image.type() == CvType.CV_8UC1) { // 灰度图像
                image.put(j, i, 255);
            } else { // 彩色图像
                image.put(j, i, 255, 255, 255);
            }
        }
    }

    /**
     * 对像素值进行修改
     */
    static void exam2() {

        Mat image = Imgcodecs.imread("./images/Lena.jpg");
        // new ShowImage(image);
        for (int j = 0; j < image.rows(); j++) {
            for (int i = 0; i < image.cols(); i++) {
                double[] ds = image.get(j, i);
                double[] newds = new double[3];
                newds[0] = ds[0] / 64 * 64 + 32;
                newds[1] = ds[1] / 64 * 64 + 32;
                newds[2] = ds[2] / 64 * 64 + 32;
                image.put(j, i, newds);
            }
        }
        // for (int i = 0; i < 10; i++) {
        // double[] ds = image.get(0, i);
        // System.out.println(ds[0] + " " + ds[1] + " " + ds[2]);
        // }
        // new ShowImage(image);
    }

    static void exam3() {
        Mat image = Imgcodecs.imread("./images/Lena.jpg");
        //获取从开机到当前的时钟周期数
        long start = Core.getTickCount();
        exam2();
        long end = Core.getTickCount();
        //返回每秒钟的时钟周期数
        double frequency = Core.getTickFrequency();
        System.out.println("frequency: " + frequency);
        Mat row = image.row(1);
        new ShowImage(row);
        //  经过的时间(单位:秒)
        System.out.println((end - start) / frequency);

    }

    /**
     * 锐化滤波器
     */
    static void exam4() {
        Mat src = Imgcodecs.imread("./images/Lena.jpg");
        Mat kernel = new Mat(3, 3, CvType.CV_32F, new Scalar(0));
        // 构造内核
        kernel.put(1, 1, 5.0);
        kernel.put(0, 1, -1.0);
        kernel.put(2, 1, -1.0);
        kernel.put(1, 0, -1.0);
        kernel.put(1, 2, -1.0);
        Mat dst = new Mat();
        // 对图像滤波
        Imgproc.filter2D(src, dst, src.depth(), kernel);
        new ShowImage(src);
        new ShowImage(dst);
    }

    /**
     * 按通道分割图像
     */
    static void exam5() {
        Mat image = Imgcodecs.imread("./images/1.jpg");
        List<Mat> mlist = new ArrayList<Mat>();
        Core.split(image, mlist);// 分割一个三通道图像为三个单通道图像
        Mat mat = mlist.get(0);
        Mat mat2 = mlist.get(1);
        Mat mat3 = mlist.get(2);
        Mat dst = new Mat();
        Core.merge(mlist, dst);// 合并三个单通道图像为一个三通道图像
        new ShowImage(mat);
        new ShowImage(mat2);
        new ShowImage(mat3);
    }

    /**
     * 图像重映射 实现波浪形效果
     * 
     * @param image
     * @param result
     */
    static void exam6(Mat image, Mat result) {
        // main函数运行的
        // Mat image = Imgcodecs.imread("./images/1.jpg");
        // Mat result = new Mat();
        // exam6(image,result);

        // 映射参数
        Mat srcX = new Mat(image.rows(), image.cols(), CvType.CV_32F);
        Mat srcY = new Mat(image.rows(), image.cols(), CvType.CV_32F);

        // 创建映射参数
        for (int i = 0; i < image.rows(); i++) {
            for (int j = 0; j < image.cols(); j++) {
                // (i,j)像素新位置
                srcX.put(i, j, j);// 保持在同一列
                // 原来在第i行的像素,现在根据一个正弦曲线移动
                srcY.put(i, j, i + 5 * Math.sin(j / 10.0));
            }
        }
        Imgproc.remap(image, result, srcX, srcY, Imgproc.INTER_LINEAR);
        new ShowImage(result);
    }

    /**
     * remap 实现图像水平翻转
     * 
     * @param image
     * @param result
     */
    static void exam7(Mat image, Mat result) {
        Mat srcX = new Mat(image.rows(), image.cols(), CvType.CV_32F);
        Mat srcY = new Mat(image.rows(), image.cols(), CvType.CV_32F);

        for (int i = 0; i < image.rows(); i++) {
            for (int j = 0; j < image.cols(); j++) {
                // 水平翻转
                srcX.put(i, j, image.cols() - j - 1);
                srcY.put(i, j, i);
            }
        }
        // 应用映射参数
        Imgproc.remap(image, // 源图像
                result, // 目标图像
                srcX, // x方向映射
                srcY, // y方向映射
                Imgproc.INTER_LINEAR); // 插值法
        new ShowImage(image);
        new ShowImage(result);

    }
}

OpenCV操作像素的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值