Java集成openCV实现图片背景切换

330 阅读1分钟

「这是我参与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>

  1. 灰化图片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)