Des*_*wal 7 python opencv image image-processing computer-vision
请建议一种新方法或至少一种方法,使这些方法中的任何一个都足够强大,能够以良好的速率进行检测
我有一些图像(大部分是从计算机屏幕拍摄的),其中存在来自相机或所谓的某种闪光灯。我想丢弃这些类型的图像或至少通知用户重新拍摄它。我怎么能这么做呢?
我没有足够的资源来训练深度学习分类模型,例如快速眩光检测
我按顺序尝试了以下几件事:
使用 OpenCVcv2.minMaxLoc函数进行明亮区域检测,但无论如何它总是返回该区域,而且对于我的图像类型来说,大多数情况下它都会失败。
这段代码使用了Clahe调整,但问题是它是删除而不是检测
我发现的最终下面的代码是我所需要的,但有人可以帮助我使其变得健壮。例如,使用这些阈值/更改它们/或使用二值化、闭合(通过扩张增加白色区域,然后通过侵蚀去除黑色噪声),以便将这些阈值推广到所有人。
def get_image_stats(img_path):
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (25, 25), 0)
no_text = gray * ((gray/blurred)>0.99) # select background only
no_text[no_text<10] = no_text[no_text>20].mean() # convert black pixels to mean value
no_bright = no_text.copy()
no_bright[no_bright>220] = no_bright[no_bright<220].mean() # disregard bright pixels
std = no_bright.std()
bright = (no_text>220).sum()
if no_text.mean()<200 and bright>8000:
return True
Run Code Online (Sandbox Code Playgroud)
以下是一些例子:

高伽玛值的伽玛校正怎么样?它是像素强度的非线性变换,如此处有关图像强度变换的 OpenCV 教程所示。在上述 OpenCV 链接中检查什么是伽玛校正。
我在你的图像上尝试了这个,伽玛值非常高。代码如下。
import cv2 as cv
import numpy as np
import os
gamma = 50
lookuptable = np.empty((1, 256), np.uint8)
lookuptable[0, :] = [np.clip(pow(i/255.0, 10)*255.0, 0, 255) for i in range(256)]
for img_file in os.listdir():
if 'jpg' in img_file:
img = cv.imread(img_file, cv.IMREAD_GRAYSCALE)
res = cv.LUT(img, lookuptable)
filename_gamma = f"{img_file.split('.')[0]}_{gamma}.jpg"
cv.imwrite(filename_gamma, res)
__, ret = cv.threshold(res, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
filename_bin = f"{img_file.split('.')[0]}_{gamma}_bin.jpg"
cv.imwrite(filename_bin, ret)
Run Code Online (Sandbox Code Playgroud)
结果如下。成对地,顶部是伽马校正图像,底部是伽马校正图像的阈值。

如果您有最后一种类型的图像,例如仅将 (245-255) 范围内的灰度值设置为前景,则可以对伽玛校正图像应用更多手动阈值以获得更好的结果。
完成后,您可以使用连接组件分析来提取有关这些提取的眩光区域的统计数据。