【发布时间】:2017-10-13 10:58:20
【问题描述】:
我有一个代码可以将 RGB 位图转换为黑白位图,使用以下代码:
public static Bitmap setDefaultValues(Bitmap bmp) {
Mat srcMat = new Mat();
org.opencv.android.Utils.bitmapToMat(bmp, srcMat, true);
final Bitmap bitmap = Bitmap.createBitmap(srcMat.clone().width(), srcMat.clone().height(), Bitmap.Config.ARGB_8888);
Imgproc.cvtColor(srcMat, srcMat, Imgproc.COLOR_BGR2GRAY, 0);
Mat srcMat1 = srcMat;
Imgproc.GaussianBlur(srcMat1, srcMat1, new Size(3, 3), 0);
//Mat srcMat1 = new Mat(srcMat.rows(), srcMat.cols(), CV_8UC1);
//int kernalsize = 3;
//Imgproc.bilateralFilter(srcMat, srcMat1, kernalsize, kernalsize * 2, kernalsize / 2);
srcMat1.convertTo(srcMat1, 0, 1.9, -120);
srcMat1.convertTo(srcMat1, CvType.CV_8U, 1.9, -120);
Imgproc.cvtColor(srcMat1, srcMat1, Imgproc.COLOR_GRAY2RGBA, 4);
org.opencv.android.Utils.matToBitmap(srcMat, bitmap, true);
return bitmap;
}
我已经实现了将 RGB 图像转换为黑白图像的代码。 这是正确的回报我,但我的问题是我无法从图像中移除阴影。
我也比较了其他应用程序,这是完美的转换,我不明白我错在哪里。
所以请帮助我如何实现我的目标。
【问题讨论】:
-
你甚至不需要 OpenCV。 ColorMatrices 非常快。并且可以轻松进行灰度和亮度/对比度操作。
-
但我想要返回白色输出而不是灰度。我也上传了想要的示例图片。
-
是同一个概念:先灰度图像,再拍摄亮度和对比度。
-
我有这样的实现,但它返回阴影(意味着无法删除阴影,根据我的要求) ColorMatrix cm = new ColorMatrix(new float[] { 1.0f, 0, 0, 0, 55.0f, 0, 1.0f, 0, 0, 55.0f, 0, 0, 1.0f, 0, 55.0f, 0, 0, 0, 1.0f, 0 });画布画布 = 新画布(srcBtm);油漆油漆 = 新油漆(); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(srcBtm, 0, 0, 油漆);返回 srcBtm;
-
执行单个 ColorMatrix 是不够的。您必须一个接一个地运行它们。做一些实验,哪些是提高亮度和对比度的最佳值。这将消除大部分灰色,留下大部分黑色和白色。但请注意,您仍然需要至少 一些 灰色,以获得抗锯齿效果。否则,线条会非常参差不齐。意思是对角线和弯曲的。
标签: java android opencv bitmap