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操作像素的方法。