我不能链接url超过2,所以我把我的照片贴到这个博客上。请在这里看到我的问题。http://blog.naver.com/mail1001/220650041897
我想知道如何使用Android OpenCV使白色部分的图像,这是白纸上的文字,透明。
我研究过通过url(我写在博客上)使黑色背景透明,我认为“阿尔法通道”与此有关。
我认为它将工作,因为我使阿尔法通道的部分,我想使透明的黑色和其他部分白色,并合并这个阿尔法通道到原来的RGB通道。
所以我做了两个实验。
1)将papaer部分变为黑色,写入部分变为白色,形成Alpha通道,并将其合并为RGB通道。
(请看博客。实验一的结果图片)
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(), image.getWidth(), CvType.CV_8UC4);
Mat tmp = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC4);
Mat alpha = new Mat(image.getHeight(), image.getWidth(), 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, alpha, 100, 255, Imgproc.THRESH_BINARY);
// split the original image into three single channel.
List<Mat> rgb = new ArrayList<Mat>(3);
Core.split(src, rgb);
// Create the final result by merging three single channel and alpha(BGRA order)
List<Mat> rgba = new ArrayList<Mat>(4);
rgba.add(rgb.get(0));
rgba.add(rgb.get(1));
rgba.add(rgb.get(2));
rgba.add(alpha);
Core.merge(rgba, dst);
// convert matrix to output bitmap
Bitmap output = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst, output);
//Utils.matToBitmap(alpha, output);
return output;
}
我试过了,但这是实验1的结果图。T_T
编辑代码
Bitmap makeBackgroundWhite(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(), image.getWidth(), CvType.CV_8UC4);
Mat tmp = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8U);
Mat alpha = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8U);
// 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);
// split the original image into three single channel.
List<Mat> bgra = new ArrayList<Mat>(4);
Core.split(src, bgra);
// Create the final result by merging three single channel and alpha(BGRA order)
bgra.remove(3);
bgra.add(alpha);
Core.merge(bgra, dst);
// convert matrix to output bitmap
Bitmap output = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst, output);
return output;
}
您的代码中有几个问题。
我想两种情况都出错了,但第二种情况只是幸运地假装成功了。
第二种情况似乎工作正常的原因是字体大多是黑色。
仔细查看心形(红色)图像,您可以发现第二种情况也失败了。
(对您来说可能不幸运,如果两种情况都失败了,您可以立即注意到问题:))
1.您使用的是带有CV_8UC4的tmp(gray)和alpha Mat。
灰度和alpha通道每像素只需要1个字节,所以将它们更改为CV_8U.
Mat tmp = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8U);
Mat alpha = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8U);
2.颜色类型容易混淆
src Mat和tmp Mat是用CV_8UC4初始化的,您正在用转换代码color_bgr2gray将src转换为tmp。
OpenCV转换矩阵,即使实际颜色类型与转换代码不匹配,所以您必须同步它们才能有意义。
// suppose you've already changed the type of tmp to CV_8U
Imgproc.cvtColor(src, tmp, Imgproc.COLOR_BGRA2GRAY);
3.拆分和合并
您的src是4个通道,您将其拆分为3个。
我不知道OpenCV在这种情况下是如何工作的,但我强烈建议您匹配通道。
ArrayList<Mat> bgra = new ArrayList<Mat>(4);
Core.split(src, bgra);
bgra.remove(3);
bgra.add(alpha); // suppose your alpha channel is already CV_8U
Core.merge(bgra, dst);
添加: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, 100, 255, CV_THRES_BINARY); // Or use CV_THRES_BINARY_INV for inverting result
// 4. Splitting & adding Alpha
vector<Mat> channels; // C++ version of ArrayList<Mat>
split(src, channels); // Automatically splits channels and adds them to channels. The size of channels = 3
channels.push_back(mask); // Adds mask(alpha) channel. The size of channels = 4
// 5. Merging
Mat dst;
merge(channels, dst); // dst is created with 4-channel(BGRA).
// Note that OpenCV applies BGRA by default if your array size is 4,
// even if actual order is different. In this case this makes sense.
// 6. Saving
imwrite("yourImagePath/yourDstImage.png", dst); // Used PNG format for preserving ALPHA channel
我想创建一个包含透明和半透明部分的图像,这样如果我给,比如说颜色x作为背景,透明部分将显示x颜色,半透明部分将显示颜色x的渐变阴影。 我需要这样一个图像在模板中使用,将由客户谁将有不同的颜色主题使用。 编辑:问题是如何创建既透明 编辑:我让我的问题更清楚了。在附加的图像中,有一个透明区域。想法是在图像中有一个透明区域和一个半透明区域(指向指针的区域,目前这不是半透明的),这样如果我给红色作为bg颜
我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。 对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。 问题是,当我尝试改变颜色时,例如使用它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。 图像与alpha RGBA值设置为50:
下面是我的JNI代码: JNIEXPORT jint JNICAL Java_org_opencv_samples_tutorial3_Sample3Native_FindSquares( } final_mat通道类型正在变为CV_32FC1。如何将频道类型转换为CV_8UC4,请帮我找出解决方法。 编辑:我已将finat_mat图像更改为CV_8UC3 但我得到空白(黑色)图像的结果??
问题内容: 情况是这样的:我有一个小的50x50图片。我还有一个小的50x50透明图片,其中包含50x50图片的框架,因此我基本上想将透明png 放在图片上方 ,并将这两个图片合并,这将导致最终的第三张图片看起来像这样:http ://img245.imageshack.us/i/50x50n.png 注意:我不想只使用HTML来做到这一点(我通过编写一个将透明png放在原始图像顶部的javasc
我有这么一个需求,已有一个项目已经搞了一年多了 我现在想把这个项目开源,发布到 github 上,但是我不想把以前的 git 提交记录让别人看到,只想看到从今天之后的 commit 有办法限制吗? 比如我现在的代码在自建的 gitlab,想发布一份到 github,但是 github 上的,我只希望被人看到的 git log 只是从今天开始的,以往的看不到
当我设定时 状态栏变成黑色半透明,但我需要白色 样品