mjo*_*osh 16 c c++ android opencv android-ndk
这是原始图像.
我在图像上的过滤器.
我正在改变图像的对比度.
dst.convertTo(dst, -1, 2, 0);
Run Code Online (Sandbox Code Playgroud)
然后使用高斯模糊进行平滑.
cv::GaussianBlur(dst,result,cv::Size(0,0),3);
cv::addWeighted(dst, 1.5, result, -0.5, 0, result);
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能对我的形象产生这种影响?
UPDATE
直方图均衡后 -
vector<Mat> channels;
Mat img_hist_equalized;
cvtColor(dst, img_hist_equalized, CV_BGR2YCrCb);
split(img_hist_equalized,channels);
equalizeHist(channels[0], channels[0]);
merge(channels,img_hist_equalized);
cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR);
Run Code Online (Sandbox Code Playgroud)
camscanner应用程序可能正在使用一些复杂的算法来处理各种闪电案例等.但我将尝试涵盖这种问题的基本方法,这里的基本思想是给定输入图像的二值化,或者更准确地说,我们可以说Theresholding a给定图像,如果你看一下OpenCV文档,有很多参考文献给出了给定图像的阈值,那么让我们从文档开始.
全局阈值处理:在这种方法中,我们假设前景的强度值总是低于某个值.在打印纸张的背景下,我们假设墨水颜色总是黑色,纸张颜色是均匀的,强度大于墨水颜色,所以我们安全地假设一些阈值(比如40),(最大值为255)并将输入图像阈值设置为:
ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
Run Code Online (Sandbox Code Playgroud)
ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)
Run Code Online (Sandbox Code Playgroud)
这种方法有许多缺点,首先它不是强度方差的独立性,所以你可以准确地估计一个阈值来分割给定图像的文本的可能性很小,它的应用非常有限,可以是仅适用于背景纸为白色且强度变化最小的情况,因此此过程不能用于真实世界图像.
自适应阈值处理:此方法涵盖给定图像中的强度变化问题,此处对相邻像素的值进行阈值处理,因此使用此方法成功捕获从较低强度到较高强度的转换,反之亦然:
thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
Run Code Online (Sandbox Code Playgroud)
进一步的工作:您可以使用各种技术去除二值图像的去噪,去除点,或者看看从图像中去除盐和胡椒的噪音.
Otu的二值化:这是另一个很好的方法,智能地计算最大值之间的阈值,在某些情况下它可能工作得很好,但在你的情况下似乎失败了.
ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
Run Code Online (Sandbox Code Playgroud)
它基本上进行相同的全局阈值处理但是现在阈值是自动计算的,使得阈值位于2个峰值之间,因此从纸张中分割出墨水.
推荐方法: 我想最好的方法是自适应阈值处理,你可以尝试一些其他预处理技术,如锐化图像,直方图均衡等,并分析它如何创建更逼真的输出,你也可以尝试做一些帖子处理,如图像去噪,形态操作
我尝试对图像进行去噪,发现它对其他方法更有效,
denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here
Run Code Online (Sandbox Code Playgroud)
但我欢迎您尝试上述方法的各种组合,以查看哪种方法适用于所有情况.
处理此类图像的一种非常简单但有效的方法是平场校正。
首先,F
通过对原始图像应用非常强的模糊过滤器来生成“假”平场图像I
。然后乘以I
的平均值F
,并将结果图像除以F
(逐像素)得到校正后的图像C
。乘法只是为了保持整体亮度,除法是魔法发生的地方。
基本上是这样的: C = (I * mean(F)) / F
最终校正后的图像C
将去除大部分(如果不是全部)不需要的大规模照明和颜色。然后剩下要做的就是进行一些对比度拉伸,您会得到与提供的参考图像非常相似的结果。(灰度,高对比度,但没有阈值)
如果您想知道所提供图像的结果是什么样的...
一、平场:
然后是修正后的图像:
最后,在增加对比度之后:
最难的部分是让平场恰到好处,因为你想要模糊它足以摆脱文本,同时尽可能多地保留背景。在这种情况下,非线性滤波器(例如中值)可以提供帮助。
归档时间: |
|
查看次数: |
5587 次 |
最近记录: |