我不能鏈接URL超過2所以我張貼我的圖片這個博客使圖像透明的白色部分。 請在這裏看到我的問題。 http://blog.naver.com/mail1001/220650041897如何使用Android的OpenCV的
我想知道如何製作圖像的白色部分,這是白皮書寫在上面,使用Android opencv透明。
我已經通過網址(我寫在了博客),這使得黑色背景透明的研究,我認爲「Alpha通道」有事情做吧。
我認爲它會工作,我做Alpha通道通過使我要讓透明的黑色部分,另一部分白色,併合並該Alpha通道的原始RGB通道。
所以我做了兩個實驗。
1)我做了篾部分爲黑色和寫作部分的白色,使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(), 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;
}
謝謝你的好意的答案!我嘗試過但失敗了。 T_T 我在我的問題中寫了編輯代碼。 昨天我看了一些博客如何使用photoshop的alpha通道。有人說,當他們用alpha通道保存圖像時,背景變成白色不透明。有人說這是在用戶保存圖像* .tga格式時發生的。 所以我想,Android的位圖對象可以有類似的問題。你對這種方法有什麼看法? – beginner
@beginner我不知道你是如何從位圖轉換爲Mat的,也許有一些格式轉換的問題。我認爲你刪除了RED頻道而不是ALPHA頻道。剛剛從Bitmap中解析出原始位圖後,是否檢查過原始位圖?嘗試bgra.remove(0); bgra.add(alpha,0); –
@beginner此外,灰度轉換代碼不會更改。將Imgproc.COLOR_BGR2GRAY替換爲Imgproc.COLOR_BGRA2GRAY –