图像处理--基于像素层面

python 图像锐化

图像锐化可以使图像的边缘更加清晰,增强图像的细节。常见的图像锐化算法有拉普拉斯算子、Sobel算子、Prewitt算子等。下面是使用拉普拉斯算子实现图像锐化的Python代码:

import cv2
import numpy as np

def laplacian_sharpen(img, ksize=3):
    # 创建拉普拉斯算子核
    kernel = np.array([[-1, -1, -1], [-1, ksize+8, -1], [-1, -1, -1]])
    # 对图像进行滤波
    result = cv2.filter2D(img, -1, kernel)
    # 将像素值限制在0~255之间
    result[result < 0] = 0
    result[result > 255] = 255
    # 将图像转换为整数类型,并返回结果
    return result.astype(np.uint8)

# 加载原始图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 进行图像锐化处理
result = laplacian_sharpen(img)
# 显示原始图像和结果图像
cv2.imshow('Original Image', img)
cv2.imshow('Sharpened Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

该代码使用了拉普拉斯算子核对图像进行滤波,增强了图像的边缘。需要注意的是,拉普拉斯算子对图像的高频细节进行增强,同时也会增加图像的噪声,因此在实际应用中需要根据具体情况进行调整。

效果图: 

 

使用一种新的光照增强算法的夜间图像增强-论文《Nighttime image enhancement using a new illumination boost algorithm》

效果图: 

 这篇博客有很多夜间图像增强算法

(70条消息) 低光照图像增强算法汇总_低照度图像增强算法_Wanderer001的博客-CSDN博客

 

图像处理算法的最新进展

背景

在深度学习大行其道的今天,计算机视觉领域似乎只剩下了机器学习/深度学习的声音,研究的关注点似乎也只局限在了深度网络、图像分类、检测、跟踪、分割、重识别等问题上,图像处理似乎变成了上个世纪的古董。实际上,随着业务和应用的开展,当计算机视觉离开了实验室,走进各色各样的应用场景,其局限性和瓶颈就开始显露出来。仅以如下几个实际场景为例:

  1. 目标检测问题中,当场景中的局部区域照度/对比度较低、带有色偏(color bias),会导致漏检或误检;而额外标注低照度、色偏场景,则可能面临标注成本的瓶颈、数据采集困难等问题。
  2. 人体特征识别时,行人的着装颜色很难定义和标注。人的着装往往不是单色,而是以一两种颜色为主,配合着其他颜色的文理和花纹。这就导致行人着装的颜色分类问题从标注部分开始就面临着困难。相类似的问题还有骑行工具(摩托车/电动车等)的颜色分类问题。
  3. 行人重识别问题中,同一个人体在不同的场景下的颜色会有不同程度的偏移(bias),影响重识别的精度;如果能对其进行简单的调整,就有可能改善算法的精度。

上述三个例子总结而言,都属于数据采集和标注成本较高,同时遇到的问题在算法设计之初不易预料到的例子。在这三个例子中,针对问题增大标注的范围不是不可以,但是时间成本和财务成本都不可小觑。如果能够适当的采用图像处理的算法对数据加以适当的调整,则有可能省却了新增标注和数据采集带来的额外麻烦。例如,针对上述三个例子,可以考虑的采用如下的方法:

  1. 如果能够对于较暗的场景,适当进行局部的照度/对比度增强,或者颜色矫正,则完全省却了标注和数据采集带来的麻烦。
  2. 如果能够对行人进行整体结构和文理的分离,只保留主要结构信息,则主要颜色应当可以保留,也就会便于标注。
  3. 如果能够进行适当的颜色调整,将会提升精度。

总结而言,目前大行其道的深度学习算法,标注数据是“硬性”的,而复杂场景下的图像往往其分布并不理想,也并不“规整”(例如对猫分类,就是“规整的问题”,只有“猫”和“非猫”两类,不存在中间态;而“较暗的区域”和“行人上衣的颜色”则是“不规整的问题”,因为答案无法用“是/非”来唯一去顶)。虽然深度网络具有巨大的容量,可以在最大程度上容忍数据的不“规整”,但是还是会在一些特殊场合下暴露出问题。如果能够利用图像处理方法对这些“不规整”的数据加以修正,突出其中我们想要的部分,会更好的实现我们的目的。

另外,随着计算机视觉技术的进步,图像处理已经越来越精深,花样和门类也越来越多。对其进行研讨和梳理,本身就是赏心悦目的事情。

照度/对比度增强

 Ying Z, Li G, Ren Y, et al. A New Image Contrast Enhancement Algorithm Using Exposure Fusion Framework[C]//International Conference on Computer Analysis of Images and Patterns. Springer, Cham, 2017: 36-46.        

知乎 - 安全中心https://link.zhihu.com/?target=http%3A//openaccess.thecvf.com/content_ICCV_2017_workshops/papers/w43/Ying_A_New_Low-Light_ICCV_2017_paper.pdf

Chen, Chen, et al. "Learning to See in the Dark."arXiv preprint arXiv:1805.01934(2018).

SID​cchen156.web.engr.illinois.edu/SID.html正在上传…重新上传取消icon-default.png?t=N176https://link.zhihu.com/?target=http%3A//cchen156.web.engr.illinois.edu/SID.html

http://cchen156.web.engr.illinois.edu/paper/18CVPR_SID.pdf​cchen156.web.engr.illinois.edu/paper/18CVPR_SID.pdficon-default.png?t=N176https://link.zhihu.com/?target=http%3A//cchen156.web.engr.illinois.edu/paper/18CVPR_SID.pdf

去雾

图像处理算子的加速

  • Chen, Jiawen, et al. "Bilateral guided upsampling."ACM Transactions on Graphics (TOG)35.6 (2016): 203.

https://people.csail.mit.edu/hasinoff/pubs/ChenEtAl16-bgu.pdf​people.csail.mit.edu/hasinoff/pubs/ChenEtAl16-bgu.pdficon-default.png?t=N176https://link.zhihu.com/?target=https%3A//people.csail.mit.edu/hasinoff/pubs/ChenEtAl16-bgu.pdf

  • He, Kaiming, Jian Sun, and Xiaoou Tang. "Guided image filtering."IEEE transactions on pattern analysis & machine intelligence6 (2013): 1397-1409.

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.649.2027&rep=rep1&type=pdf​citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.649.2027&rep=rep1&type=pdficon-default.png?t=N176https://link.zhihu.com/?target=http%3A//citeseerx.ist.psu.edu/viewdoc/download%3Fdoi%3D10.1.1.649.2027%26rep%3Drep1%26type%3Dpdf

 

Retinex算法效果展示与分析

在这里插入图片描述
上图展示了Retinex算法在一些真实数据上面的效果。上面主要展示了该算法在一些文档上面的增强效果,第一行的5张图片表示的是原始的输入图片,第二行的5张图片表示的是使用Retinex算法增强之后的效果。通过观察我们可以发现,该算法不仅能够增强图像的亮度信息,同时可以去除图片中的部分阴影信息;但是该算法的运算速度比较慢,不能应用到一些实时的场景中。

 低光图像目标检测的研究成果总结 - 腾讯云开发者社区-腾讯云 (tencent.com)

低光图像目标检测的研究成果总结 - 腾讯云开发者社区-腾讯云 (tencent.com) 

1、深度学习以前

1、A Novel Method to Compensate Variety of Illumination In Face Detection

本文介绍了一些基于空间域的传统方法。采用LogAbout进行光照补偿后,正确检测率明显提高。该思想能够快速有效地解决光照补偿问题,适用于自动检测人脸和实时跟踪人脸。本文提出的LogAbout思想也有助于一般的图像处理、目标检测和识别。

2、An Image-Range Fusion Pedestrian Detection System in Low Illumination Conditions

本文提出了一种同时应用图像数据和距离数据的图像-距离融合系统(IRFS)。对于图像部分,提出了一种动态照明物体(DIO)检测器,以克服部分光照条件不确定带来的问题。具体来说,DIO检测器应用两种特征,包括用于表示形状信息的方向梯度直方图(HOG)和用于建模纹理信息的对数加权模式(LWP)。

3、Automatic human face detection and recognition under non-uniform illumination

本文提出了一种自动人脸检测和识别系统。该过程包括五个步骤:(1)哈尔小波变换,(2)人脸边缘检测,(3)对称轴检测,(4)人脸检测和(5)人脸识别。步骤1分解输入图像,减少图像冗余。步骤2使用边缘信息排除非面部区域,而步骤3使用梯度方向进一步缩小面部区域。步骤4通过模板匹配来限制类似人脸的区域。最后,第五步确定类人脸区域中的最佳人脸位置,并基于主成分分析进行人脸识别。该系统在非均匀光照条件下表现出显著的鲁棒性。

4、Detection Algorithm for Color Image by Multiple Surveillance Camera under Low Illumination Based-on Fuzzy Corresponding Map

针对低照度下的真实监控系统,本文提出了一种双摄像机彩色动态图像目标检测算法。它为低亮度条件提供模糊对应图和颜色相似度的自动计算,在低照度下检测电荷耦合器件相机图像中的小彩色区域。在低亮度条件下对日本某市中心真实监控摄像机拍摄的两幅动态图像的实验检测结果表明,在相同的误报率下,与独立检测算法相比,该算法的准确率提高了15%,并讨论了该算法在严重监控情况下的可实现性。所提出的算法正被考虑用于日本一个安全性相对较差的市区(购物中心)的低成本监控系统。

5、Face Detection with the Modified Census Transform

光照变化是目标识别中的一个大问题,通常需要在分类前进行昂贵的补偿。希望有一种图像到图像的变换,它只揭示目标的结构,以便进行有效的匹配。在这方面,本文工作的贡献是双重的。首先,本文引入光照不变的局部结构特征进行目标检测。为了提高计算效率,本文提出了一种改进的普查变换,它改进了扎比和伍德菲尔的原始工作[10]。本文展示了一些缺点以及如何用修改后的版本克服它们。其次,本文引入了一个高效的四阶段分类器用于快速检测。每个单级分类器是一个线性分类器,由一组特征查找表组成。我们表明,第一阶段只评估20个特征,过滤掉99%以上的背景位置。因此,分类器结构比先前描述的多阶段方法简单得多,同时具有类似的能力。光照不变特征与简单分类器的结合导致了标准计算机上的实时系统(60秒,图像大小:288×384,2GHz奔腾)。检测结果显示在该领域两个常用的数据库上,即麻省理工学院+CMU的130幅图像和生物标识的1526幅图像。本文实现了90%以上的检测率和10-7%的极低假阳性率。我们还提供了一个演示程序,可以在互联网上找到http://www.iis.fraunhofer.de/bv/biometrie/download/.

6、Image Detection Under Low-Level Illumination

微光条件下的图像检测被视为一个假设检验问题,在该问题中,观测值被建模为散粒噪声过程。由于计算散粒噪声过程的李可利-胡德比率是不可行的,本文建议使用通过过滤和采样观测值获得的一维检验统计量。选择滤波器是为了最大化广义信噪比。一维检验统计量的似然比通过在每个假设下反转相应的特征函数来进行数值评估。

2、深度学习以后

1、Deep Learning based Effective Surveillance System for Low-Illumination Environments

本文提出了一个系统,通过结合图像质量改善网络和目标检测网络,帮助获取在不同地方使用的普通监视摄像机的质量图像。这将提高夜间低照度区域的安全性。还可以建立一个更有效的监测系统,监测低照度地区的情况。 2、Getting to know low-light images with the Exclusively Dark dataset

提出了暗光目标检测数据集,下载链接:GitHub - cs-chan/Exclusively-Dark-Image-Dataset: Exclusively Dark (ExDARK) dataset which to the best of our knowledge, is the largest collection of low-light images taken in very low-light environments to twilight (i.e 10 different conditions) to-date with image class and object level annotations.

3、IMAGE PROCESSING APPROACHES FOR AUTONOMOUS NAVIGATION OF TERRESTRIAL VEHICLES IN LOW ILLUMINATION

计算机视觉可以作为任何自主系统的一个组成部分。视觉输入和处理能够实现更快、更早的决策。计算机视觉的一个重要挑战是物体的检测和识别。这种挑战在低照度下更为明显。本文提出了一个检测和识别模型的道路警告标志与语音通知系统都自动和普通车辆考虑不同的照明水平。使用opencv分析来自车辆的实时视频。使用过滤器去除了视频中的噪音。检测是基于哈尔级联和训练样本的积极和消极的图像。文本识别基于模式匹配。语音通知是使用字符串到语音转换器完成的。考虑到车辆前灯的强光,夜视被照亮了。

4、 Low Illumination Enhancement For Object Detection In Self-Driving*

目标检测在自动驾驶领域发挥着重要作用。光照对目标检测有很大的影响,但目前大多数方法都没有很好地解决弱光环境下的目标检测问题。本文提出了一种基于循环生成对抗网络的图像转换优化网络。我们重新设计了CycleGAN的鉴别器网络,增加了额外的鉴别器,优化了网络的多个部分如损失函数,并在网络转换后增加了目标检测网络。利用牛津大学的机器人小车数据集验证了该方法的有效性,结果表明,该方法能够显著提高低照度环境下的检测精度,增加检测到的目标数量。

5、Low-Illumination Image Enhancement for Night-Time UAV Pedestrian Detection

为了在夜间条件下利用无人机实现可靠的行人检测,提出了一种图像增强方法来改善低照度图像质量。首先,通过双曲正切曲线将图像亮度映射到期望的水平。其次,针对YCbCr颜色空间中的反锐化滤波器,提出了块匹配和三维滤波方法,用于图像去噪和锐化。最后,利用卷积神经网络模型进行行人检测,完成监控任务。实验结果表明,增强图像的闵可夫斯基距离度量指数提高到0.975,检测准确率分别达到0.907和0.840,是其他图像增强方法中最高的。该方法对智能城市应用中的夜间无人机视觉监控具有潜在价值。

6、Nighttime Vehicle Detection Based on Bio-Inspired Image Enhancement and Weighted Score-Level Feature Fusion

本文提出了一种有效的夜间车辆检测系统,该系统结合了一种新颖的仿生图像增强方法和加权特征融合技术。受自然视觉处理中的视网膜机制的启发,本文开发了一种夜间图像增强方法,通过建模来自水平细胞的自适应反馈和双极细胞的中央包围的拮抗接受域。在此基础上,利用卷积神经网络、梯度方向直方图和局部二值模式对分类器进行特征提取,利用支持向量机对分类器进行训练。这些特征通过将每个特征的得分向量与学习到的权重相结合来融合。在检测过程中,通过将车辆尾灯检测与目标提案相结合来生成准确的感兴趣区域。实验结果表明,所提出的仿生图像增强方法对车辆检测有较好的效果。我们的车辆检测方法显示了95.95%的检出率,每幅图像为0.0575假阳性,并优于一些最先进的技术。我们提出的方法可以处理各种场景,包括不同类型和大小的车辆,那些有遮挡和模糊区域。它还可以检测不同位置的车辆和多辆车辆。

 ========================================================================

python实现图像白平衡

转自:https://www.cnblogs.com/hangy/p/12569157.html

import cv2
import numpy as np
 
def white_balance(img, mode=1):
    """白平衡处理(默认为1均值、2完美反射、3灰度世界、4基于图像分析的偏色检测及颜色校正、5动态阈值)"""
    # 读取图像
    b, g, r = cv2.split(img)
    # 均值变为三通道
    h, w, c = img.shape
    if mode == 1:
        # 默认均值  ---- 简单的求均值白平衡法
        b_avg, g_avg, r_avg = cv2.mean(b)[0], cv2.mean(g)[0], cv2.mean(r)[0]
        # 求各个通道所占增益
        k = (b_avg + g_avg + r_avg) / 3
        kb, kg, kr = k / b_avg, k / g_avg, k / r_avg
        b = cv2.addWeighted(src1=b, alpha=kb, src2=0, beta=0, gamma=0)
        g = cv2.addWeighted(src1=g, alpha=kg, src2=0, beta=0, gamma=0)
        r = cv2.addWeighted(src1=r, alpha=kr, src2=0, beta=0, gamma=0)
        output_img = cv2.merge([b, g, r])
    elif mode == 2:
        # 完美反射白平衡 ---- 依赖ratio值选取而且对亮度最大区域不是白色的图像效果不佳。
        output_img = img.copy()
        sum_ = np.double() + b + g + r
        hists, bins = np.histogram(sum_.flatten(), 766, [0, 766])
        Y = 765
        num, key = 0, 0
        ratio = 0.01
        while Y >= 0:
            num += hists[Y]
            if num > h * w * ratio / 100:
                key = Y
                break
            Y = Y - 1
 
        sumkey = np.where(sum_ >= key)
        sum_b, sum_g, sum_r = np.sum(b[sumkey]), np.sum(g[sumkey]), np.sum(r[sumkey])
        times = len(sumkey[0])
        avg_b, avg_g, avg_r = sum_b / times, sum_g / times, sum_r / times
 
        maxvalue = float(np.max(output_img))
        output_img[:, :, 0] = output_img[:, :, 0] * maxvalue / int(avg_b)
        output_img[:, :, 1] = output_img[:, :, 1] * maxvalue / int(avg_g)
        output_img[:, :, 2] = output_img[:, :, 2] * maxvalue / int(avg_r)
    elif mode == 3:
        # 灰度世界假设
        b_avg, g_avg, r_avg = cv2.mean(b)[0], cv2.mean(g)[0], cv2.mean(r)[0]
        # 需要调整的RGB分量的增益
        k = (b_avg + g_avg + r_avg) / 3
        kb, kg, kr = k / b_avg, k / g_avg, k / r_avg
        ba, ga, ra = b * kb, g * kg, r * kr
 
        output_img = cv2.merge([ba, ga, ra])
    elif mode == 4:
        # 基于图像分析的偏色检测及颜色校正
        I_b_2, I_r_2 = np.double(b) ** 2, np.double(r) ** 2
        sum_I_b_2, sum_I_r_2 = np.sum(I_b_2), np.sum(I_r_2)
        sum_I_b, sum_I_g, sum_I_r = np.sum(b), np.sum(g), np.sum(r)
        max_I_b, max_I_g, max_I_r = np.max(b), np.max(g), np.max(r)
        max_I_b_2, max_I_r_2 = np.max(I_b_2), np.max(I_r_2)
        [u_b, v_b] = np.matmul(np.linalg.inv([[sum_I_b_2, sum_I_b], [max_I_b_2, max_I_b]]), [sum_I_g, max_I_g])
        [u_r, v_r] = np.matmul(np.linalg.inv([[sum_I_r_2, sum_I_r], [max_I_r_2, max_I_r]]), [sum_I_g, max_I_g])
        b0 = np.uint8(u_b * (np.double(b) ** 2) + v_b * b)
        r0 = np.uint8(u_r * (np.double(r) ** 2) + v_r * r)
        output_img = cv2.merge([b0, g, r0])
    elif mode == 5:
        # 动态阈值算法 ---- 白点检测和白点调整
        # 只是白点检测不是与完美反射算法相同的认为最亮的点为白点,而是通过另外的规则确定
        def con_num(x):
            if x > 0:
                return 1
            if x < 0:
                return -1
            if x == 0:
                return 0
 
        yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
        # YUV空间
        (y, u, v) = cv2.split(yuv_img)
        max_y = np.max(y.flatten())
        sum_u, sum_v = np.sum(u), np.sum(v)
        avl_u, avl_v = sum_u / (h * w), sum_v / (h * w)
        du, dv = np.sum(np.abs(u - avl_u)), np.sum(np.abs(v - avl_v))
        avl_du, avl_dv = du / (h * w), dv / (h * w)
        radio = 0.5  # 如果该值过大过小,色温向两极端发展
 
        valuekey = np.where((np.abs(u - (avl_u + avl_du * con_num(avl_u))) < radio * avl_du)
                            | (np.abs(v - (avl_v + avl_dv * con_num(avl_v))) < radio * avl_dv))
        num_y, yhistogram = np.zeros((h, w)), np.zeros(256)
        num_y[valuekey] = np.uint8(y[valuekey])
        yhistogram = np.bincount(np.uint8(num_y[valuekey].flatten()), minlength=256)
        ysum = len(valuekey[0])
        Y = 255
        num, key = 0, 0
        while Y >= 0:
            num += yhistogram[Y]
            if num > 0.1 * ysum:  # 取前10%的亮点为计算值,如果该值过大易过曝光,该值过小调整幅度小
                key = Y
                break
            Y = Y - 1
 
        sumkey = np.where(num_y > key)
        sum_b, sum_g, sum_r = np.sum(b[sumkey]), np.sum(g[sumkey]), np.sum(r[sumkey])
        num_rgb = len(sumkey[0])
 
        b0 = np.double(b) * int(max_y) / (sum_b / num_rgb)
        g0 = np.double(g) * int(max_y) / (sum_g / num_rgb)
        r0 = np.double(r) * int(max_y) / (sum_r / num_rgb)
 
        output_img = cv2.merge([b0, g0, r0])
    else:
        raise TypeError('mode should be in [1,2,3,4,5]. Got {}'.format(mode))
    output_img = np.uint8(np.clip(output_img, 0, 255))
    return output_img

 

Guess you like

Origin blog.csdn.net/Hoshea_sun/article/details/129356446