gpt4 book ai didi

python - 检测图像中不均匀照明的稳健算法[仅需要检测]

转载 作者:行者123 更新时间:2023-12-02 15:08:58 24 4
gpt4 key购买 nike

tesseract OCR 文本识别的最大挑战之一是图像的不均匀照明。
我需要一种算法来确定图像是否包含不均匀的照明。
测试图像
我附上了no illumination image的图片, glare image( white-spotted image)shadow containing image .
如果我们给算法一个图像,算法应该分为两类,如

  • 没有不均匀的照明 - 我们的 no illumination image将属于这一类。
  • 光照不均 - 我们的 glare image( white-spotted image) , shadow containing image将属于这一类。

  • 无照明图像 - A 类
    Good Image
    不均匀照明图像(眩光图像(白点图像)) B 类
    Glare Image
    不均匀照明图像(包含图像的阴影)类别 B
    Ueven Lightning conditions
    初步方法
  • 将色彩空间更改为 HSV
  • HSV值 channel 的直方图分析识别光照不均。

  • Instead of the first two steps, we can use the perceived brightnesschannel instead of the value channel of HSV


  • 设置一个低阈值以获得小于低阈值的像素数
  • 设置高阈值以获取高于高阈值的像素数
  • 低像素值百分比和高像素值百分比以检测不均匀闪电情况(百分比的设置阈值也是如此)

  • But I could not find big similarities between uneven illuminationimages. I just found there are some pixels that have low value andsome pixels have high value with histogram analysis.



  • 基本上我的感觉是,如果将一些阈值设置为低阈值并找出有多少像素小于低阈值并​​设置一些高阈值以找出有多少像素大于该阈值。通过像素数,我们可以得出结论来检测图像中不均匀的闪电条件吗?这里我们需要最终确定两个阈值和像素数的百分比才能得出结论。
    V channel Histogram analysis between good and uneven illumination  image
    V channel histogram analysis between white glare spot image and uneven lightning condition image
    def  show_hist_v(img_path):
    img = cv2.imread(img_path)
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h,s,v = cv2.split(hsv_img)
    histr =cv2.calcHist(v, [0], None, [255],[0,255])
    plt.plot(histr)
    plt.show()
    low_threshold =np.count_nonzero(v < 50)
    high_threshold =np.count_nonzero(v >200)
    total_pixels = img.shape[0]* img.shape[1]
    percenet_low =low_threshold/total_pixels*100
    percenet_high =high_threshold/total_pixels*100
    print("Total Pixels - {}\n Pixels More than 200 - {} \n Pixels Less than 50 - {} \n Pixels percentage more than 200 - {} \n Pixel spercentage less than 50 - {} \n".format(total_pixels,high_threshold,low_threshold,percenet_low,percenet_high))


    return total_pixels,high_threshold,low_threshold,percenet_low,percenet_high


    那么有人可以改进我的初始方法或提供比这种方法更好的 检测 一般情况下图像中的照明不均匀?
    另外,我尝试了感知亮度而不是值 channel ,因为值 channel 采用 (b,g,r) 值的最大值,所以感知亮度是一个不错的选择,因为我认为
     def get_perceive_brightness( float_img):
    float_img = np.float64(float_img) # unit8 will make overflow
    b, g, r = cv2.split(float_img)
    float_brightness = np.sqrt(
    (0.241 * (r ** 2)) + (0.691 * (g ** 2)) + (0.068 * (b ** 2)))
    brightness_channel = np.uint8(np.absolute(float_brightness))
    return brightness_channel

    def show_hist_v(img_path):
    img = cv2.imread(img_path)
    v = get_perceive_brightness(img)
    histr =cv2.calcHist(v, [0], None, [255],[0,255])
    plt.plot(histr)
    plt.show()
    low_threshold =np.count_nonzero(v < 50)
    high_threshold =np.count_nonzero(v >200)
    total_pixels = img.shape[0]* img.shape[1]
    percenet_low =low_threshold/total_pixels*100
    percenet_high =high_threshold/total_pixels*100
    print("Total Pixels - {}\n Pixels More than 200 - {} \n Pixels Less than 50 - {} \n Pixels percentage more than 200 - {} \n Pixel spercentage less than 50 - {} \n".format(total_pixels,high_threshold,low_threshold,percenet_low,percenet_high))


    return total_pixels,high_threshold,low_threshold,percenet_low,percenet_high

    感知亮度 channel 的直方图分析
    Perceived brightness channel histogram analysis
    正如艾哈迈德所建议的那样。
    def get_percentage_of_binary_pixels(img=None, img_path=None):
    if img is None:
    if img_path is not None:
    gray_img = cv2.imread(img_path, 0)
    else:
    return "No img or img_path"
    else:
    print(img.shape)
    if len(img.shape) > 2:
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    else:
    gray_img = img
    h, w = gray_img.shape
    guassian_blur = cv2.GaussianBlur(gray_img, (5, 5), 0)
    thresh_value, otsu_img = cv2.threshold(guassian_blur, 0, 255,
    cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    cv2.imwrite("binary/{}".format(img_path.split('/')[-1]), otsu_img)
    black_pixels = np.count_nonzero(otsu_img == 0)
    # white_pixels = np.count_nonzero(otsu_img == 255)

    black_pixels_percentage = black_pixels / (h * w) * 100
    # white_pixels_percentage = white_pixels / (h * w) * 100

    return black_pixels_percentage
    当我们通过 otsu 二值化获得超过 35% 的黑色像素百分比时,我们可以检测到 80% 左右的不均匀照明图像。当光照发生在图像的小区域时,检测失败。
    提前致谢

    最佳答案

    我建议使用除法技巧将文本与背景分开,然后仅计算背景上的统计信息。在设置一些合理的阈值后,很容易为照明创建分类器。

    def get_image_stats(img_path, lbl):
    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

    print(lbl)
    std = no_bright.std()
    print('STD:', std)
    bright = (no_text>220).sum()
    print('Brigth pixels:', bright)
    plt.figure()
    plt.hist(no_text.reshape(-1,1), 25)
    plt.title(lbl)

    if std>25:
    print("!!! Detected uneven illumination")
    if no_text.mean()<200 and bright>8000:
    print("!!! Detected glare")
    这导致:
     good_img
    STD: 11.264569863071165
    Brigth pixels: 58

    glare_img
    STD: 15.00149131296984
    Brigth pixels: 15122
    !!! Detected glare

    uneven_img
    STD: 57.99510339944441
    Brigth pixels: 688
    !!! Detected uneven illumination
    enter image description here
    现在让我们分析直方图并应用一些常识。我们期望背景是均匀的并且具有低方差,就像“good_img”中的情况一样。如果它的方差很大,那么它的标准偏差就会很高,这是亮度不均匀的情况。在下图中,您可以看到 3 个(较小的)峰负责 3 个不同的照明区域。中间的最大峰值是将所有黑色像素设置为平均值的结果。我相信将 STD 高于 25 的图像称为“照明不均匀”情况是安全的。
    有眩光时很容易发现大量明亮像素(见右图)。眩光图像看起来像一个很好的图像,除了热点。将明亮像素的阈值设置为 8000(总图像大小的 1.5%)应该可以很好地检测此类图像。有可能背景到处都很亮,所以如果 no_text像素的平均值在200以上,那么就是这种情况,不需要检测热点。

    关于python - 检测图像中不均匀照明的稳健算法[仅需要检测],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63933790/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com