如何使用Android opencv使图像的白色部分透明

前端之家收集整理的这篇文章主要介绍了如何使用Android opencv使图像的白色部分透明前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我无法链接超过2的网址,所以我将我的图片发布到此博客.
请在这里看看我的问题.
http://blog.naver.com/mail1001/220650041897

我想知道如何制作图像的白色部分,即使用Android opencv透明的白皮书.

我通过url(我在博客上写过)研究了黑色背景透明,我认为“Alpha Channel”与它有关.

我认为通过制作我希望制作透明黑色而另一部分为白色的部分来制作Alpha通道,并将此Alpha通道合并到原始RGB通道.

所以我做了两个实验.

1)我将papaer部分设为黑色,将写入部分设为白色以制作Alpha通道.并将其合并到RGB Channel.

(请参阅博客.实验1的alpha通道图片)

我认为写作应该是相同的,背景应该是透明的,但背景只会变成白色而且很透明.

(请参阅博客.实验1的结果图)

2)此时,纸张部分为白色,书写部分为黑色.但这次只有写作才变得透明.

(请参阅博客.实验2的alpha通道图片和结果图片)

在第二个实验中,我的意思是透明变透明,但在第一个实验中它不起作用.

我做错了哪一部分?有没有我错误理解的概念?

这是我测试的来源.

Bitmap test(Bitmap image) {
// convert image to matrix
Mat src = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC4);
Utils.bitmapToMat(image,src);

// init new matrices
Mat dst = new Mat(image.getHeight(),CvType.CV_8UC4);
Mat tmp = new Mat(image.getHeight(),CvType.CV_8UC4);
Mat alpha = new Mat(image.getHeight(),CvType.CV_8UC4);

// convert image to grayscale
Imgproc.cvtColor(src,tmp,Imgproc.COLOR_BGR2GRAY);

// threshold the image to create alpha channel with complete transparency in black background region and zero transparency in foreground object region.
Imgproc.threshold(tmp,alpha,100,255,Imgproc.THRESH_BINARY_INV);
//Imgproc.threshold(tmp,Imgproc.THRESH_BINARY);

// split the original image into three single channel.
List

谢谢你的善意答复.

我尝试了但是它是相同的实验1的结果图. T_T

编辑代码

Bitmap makeBackgroundWhite(Bitmap image) {
    // convert image to matrix
    Mat src = new Mat(image.getHeight(),CvType.CV_8UC4);
    Utils.bitmapToMat(image,src);

    // init new matrices
    Mat dst = new Mat(image.getHeight(),CvType.CV_8UC4);
    Mat tmp = new Mat(image.getHeight(),CvType.CV_8U);
    Mat alpha = new Mat(image.getHeight(),CvType.CV_8U);

    // convert image to grayscale
    Imgproc.cvtColor(src,Imgproc.COLOR_BGR2GRAY);

    // threshold the image to create alpha channel with complete transparency in black background region and zero transparency in foreground object region.
    Imgproc.threshold(tmp,Imgproc.THRESH_BINARY_INV);

    // split the original image into three single channel.
    List
最佳答案
您的代码中存在几个问题.
我猜两个案子都出错了,但第二个案例很幸运,​​假装成功.
第二种情况似乎工作正常的原因是字体大多是黑色的.
仔细观察心脏(红色)图像,你会发现第二个案例也失败了.
(你可能不幸运,如果两种情况都失败了你可以立即注意到问题:))

1.你正在使用tmp(灰色)和alpha Mat与CV_8UC4.
灰度和alpha通道每个像素只需要1个字节,因此将它们更改为CV_8U.

Mat tmp = new Mat(image.getHeight(),CvType.CV_8U);
Mat alpha = new Mat(image.getHeight(),CvType.CV_8U);

2.颜色类型令人困惑
使用CV_8UC4初始化src Mat和tmp Mat,并使用转换代码将src转换为tmp:COLOR_BGR2GRAY.
即使实际颜色类型与转换代码不匹配,OpenCV也会转换矩阵,因此您必须同步它们才能有意义.

// suppose you've already changed the type of tmp to CV_8U
Imgproc.cvtColor(src,Imgproc.COLOR_BGRA2GRAY);

3.拆分和合并
你的src是4通道,你把它分成3.
我不知道OpenCV在这种情况下是如何工作的,但我强烈建议你匹配频道.

ArrayList

增加:C版源代码
希望这可以帮助.

// 1. Loading
Mat src = imread("yourImagePath/yourOriginalImage.jpg");  // This code will automatically loads image to Mat with 3-channel(BGR) format

// 2. Grayscaling
Mat gray;
cvtColor(src,gray,CV_BGR2GRAY);   // This will convert BGR src to GRAY

// 3. Thresholding
Mat mask;
threshold(gray,mask,CV_THRES_BINARY); // Or use CV_THRES_BINARY_INV for inverting result

// 4. Splitting & adding Alpha
vector

猜你在找的Android相关文章