「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
下载openCV
官网地址:Releases - OpenCV
下载地址:Download OpenCV from SourceForge.net
这里我用的opencv440的windows版本
下载完成后点击exe进行安装,安装完成后会生成opencv文件夹,里面有各个环境文件

boot 示例
1.在opencv\build\java\以及opencv\build\java\x64下提取jar包以及动态库。
2.在resources下创建lib/opencv文件夹,并将这两个包放进去。
3.在pom.xml添加依赖如下(或者在项目之中添加jar包)
<dependency>
<groupId>org</groupId>
<artifactId>opencv</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\lib\opencv\opencv-440.jar</systemPath>
</dependency>
- 灰化图片Demo
package com.me.lab.lab_tool;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.net.URL;
import static org.opencv.highgui.HighGui.imshow;
import static org.opencv.highgui.HighGui.waitKey;
import static org.opencv.imgcodecs.Imgcodecs.imread;
import static org.opencv.imgcodecs.Imgcodecs.imwrite;
import static org.opencv.imgproc.Imgproc.COLOR_RGB2GRAY;
import static org.opencv.imgproc.Imgproc.cvtColor;
/**
* @author An
* @title: DemoApplicationTests
* @projectName me_lab
* @description: 灰化图片
* @date 2022/1/5 0005下午 22:06
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
/**
* @return
* @Description
* @Param
* @Author zhangsan
* @Date 2020.09.05 9:43
**/
@Test
public void testOpencv() throws Exception {
// 解决awt报错问题
System.setProperty("java.awt.headless", "false");
System.out.println(System.getProperty("java.library.path"));
// 加载动态库
URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java440.dll");
System.load(url.getPath());
// 读取图像
Mat image = imread("D:\IDEA\me\me_lab\lab_tool\img\11.jpg");
if (image.empty()) {
throw new Exception("image is empty");
}
imshow("Original Image", image);
// 创建输出单通道图像
Mat grayImage = new Mat(image.rows(), image.cols(), CvType.CV_8SC1);
// 进行图像色彩空间转换
cvtColor(image, grayImage, COLOR_RGB2GRAY);
imshow("Processed Image", grayImage);
imwrite("D:\IDEA\me\me_lab\lab_tool\img\hui11.jpg", grayImage);
waitKey();
}
}
效果图
java循环像素点改背景
效果: 有一些锯齿,下面有使用opencv修改背景的
代码:
package com.me.lab.lab_tool.img;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
/**
* @author An
* @title: BackGroundTest
* @projectName me_lab
* @description: 图片背景修改
* @date 2022/1/5 0005下午 18:38
*/
public class BackGroundTest {
/**
* 传入图片路径将图片变更为透明背景然后返回 inputStream
* @param url
* @return
*/
public static InputStream toTransparentBackground(String url){
try {
BufferedImage bufferedImage = ImageIO.read(new File(url));
int alpha = 255;
String removeRgb = null;
// 遍历Y轴的像素
for (int y = bufferedImage.getMinY(); y < bufferedImage.getHeight(); y++) {
// 遍历X轴的像素
for (int x = bufferedImage.getMinX(); x < bufferedImage.getWidth(); x++) {
int rgb = bufferedImage.getRGB(x, y);
// 取图片边缘颜色作为对比对象
if (y == bufferedImage.getMinY() && x == bufferedImage.getMinX()) {
removeRgb = convertRgbStr(rgb);
}
// 设置为透明背景
if (removeRgb.equals(convertRgbStr(rgb))) {
// alpha = 0;
rgb = 0x00f1ff;
} else {
// alpha = 255;
// rgb = 255;
}
// rgb = (alpha << 24) | (rgb & 0x00ffffff);
bufferedImage.setRGB(x, y, rgb);
}
}
return bufferedImageToInputStream(bufferedImage);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取像素点的 rgb值
* @param color
* @return
*/
public static String convertRgbStr(int color) {
// 获取color(RGB)中R位
int red = (color & 0xff0000) >> 16;
// 获取color(RGB)中G位
int green = (color & 0x00ff00) >> 8;
// 获取color(RGB)中B位
int blue = (color & 0x0000ff);
return red + "," + green + "," + blue;
}
/**
* 将 bufferedImage 转换成 inputStream
* @param image
* @return
*/
public static InputStream bufferedImageToInputStream(BufferedImage image){
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ImageIO.write(image, "png", os);
InputStream input = new ByteArrayInputStream(os.toByteArray());
return input;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws IOException {
//String str = "http://58.57.18.50:4434/fastdfsfile/00/04/wKgE52C4PxuAXvOvAABABLIVDZg24.jpeg";
String str = "D:\IDEA\me\me_lab\lab_tool\img\yzcdn.jpg";
InputStream inputStream = toTransparentBackground(str);
FileOutputStream fileOutputStream = new FileOutputStream("D:\IDEA\me\me_lab\lab_tool\img\yzcdn11.jpg");
int read = 0;
byte[] data = new byte[1 << 10];
while((read = inputStream.read(data)) != -1 ){
fileOutputStream.write(data);
}
fileOutputStream.close();
}
}
python使用聚类修改背景颜色
import cv2
import numpy as np
import sys
src_cv_img = cv2.imread('20220106173723.jpg')
h,w,c = src_cv_img.shape
print(h,w,c)
cv_img = src_cv_img.reshape(-1,3)
print(cv_img.shape)
from sklearn.cluster import KMeans
estimator = KMeans(n_clusters=4)#构造聚类器
estimator.fit(cv_img)
label_pred = estimator.labels_
x = np.argmax(np.bincount(label_pred))
for i,j in enumerate(cv_img):
if(label_pred[i] == x ):
cv_img[i] = np.asarray([0,0,255])
output_cv_img = cv_img.reshape(h,w,c)
cv2.imwrite("tmp.jpg",output_cv_img)