有时候许多图像的对比度较低,在进行特征区域的识别时较为困难,下面我们利用几种方法进行分析,如何提高图像的对比度。
step 1:
利用下面代码,看一下原图像
import
cv2
import
numpy
as
np
import
matplotlib
.
pyplot
as
plt
def ReadAndShowImage():
image = cv2.imread("00.jpg")
cv2.imshow("OriginImage", image)
cv2.waitKey(0)
原图整体较黑,无法清晰明显的得到图像中的数字
step 2:
利用灰度直方图大致看一下灰度分布
def GainHist():
image = cv2.imread("00.jpg")
grayImage = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
restHist = cv2.calcHist(grayImage,[0],None,[256],[0,256])
plt.title("Hist of GrayImage")
plt.xlabel("Amount of Pixel")
plt.ylabel("Gray Scale")
plt.plot(restHist)
plt.savefig("hist")
灰度直方图如下

可以发现,大部分的图像像素都集中在灰度值较小的范围,这也是造成图像较黑的主要原因。能不能将他“拉直”一点,将像素集中到x轴的中间靠上部分
下面代码主要实现这个功能
def EqualHist():
image = cv2.imread("00.jpg")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
equalHist = cv2.equalizeHist(grayImage,None)
hist = cv2.calcHist(equalHist,[0],None,[256],[0,255])
plt.title("EqualHist of GrayImage")
plt.xlabel("Amount of Pixel")
plt.ylabel("Gray Scale")
plt.plot(hist)
cv2.imshow("EqualHist",equalHist)
cv2.imwrite("equalHist.jpg",equalHist)
cv2.waitKey(0)
上面代码的效果如下图所示


上面经过均衡化后的图像,对比度明显较原图得到增强,效果也比较明显,最后我们要的肯定不是灰度图像,干扰太多了,二值化图像就可以避免这个问题,我们继续向下看
def AdaptHist():
image = cv2.imread("00.jpg")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
equalHist = cv2.equalizeHist(grayImage, None)
adapthist = cv2.createCLAHE(clipLimit=40)
imageAdaptHist = adapthist.apply(equalHist)
cv2.imshow("adapthistimage",imageAdaptHist)
cv2.imwrite("adapthist.jpg",imageAdaptHist)
cv2.waitKey(0)
效果入下

上面照片比直方图均衡化后的图像,左下角好像没有那么白
通过对OpenCV提供的下面的一些参数,我们按照顺序统统试一下,看看有什么区别
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
cv2.THRESH_OTSU
cv2.THRESH_TRIANGLE
def Threshs():
image = cv2.imread("00.jpg")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
equalHist = cv2.equalizeHist(grayImage, None)
adapthist = cv2.createCLAHE(clipLimit=40)
imageAdaptHist = adapthist.apply(equalHist)
thresh = 60
max_val = 255
ret, out1 = cv2.threshold(imageAdaptHist, thresh, max_val,cv2.THRESH_BINARY)
ret, out2 = cv2.threshold(imageAdaptHist, thresh, max_val, cv2.THRESH_BINARY_INV)
ret, out3 = cv2.threshold(imageAdaptHist, thresh, max_val, cv2.THRESH_TRUNC)
ret, out4 = cv2.threshold(imageAdaptHist, thresh, max_val, cv2.THRESH_TOZERO)
ret, out5 = cv2.threshold(imageAdaptHist, thresh, max_val, cv2.THRESH_TOZERO_INV)
ret, out6 = cv2.threshold(imageAdaptHist, thresh, max_val, cv2.THRESH_OTSU)
ret, out7 = cv2.threshold(imageAdaptHist, thresh, max_val, cv2.THRESH_TRIANGLE)
inal = np.concatenate((out1,out2,out3,out4), axis=0)
inal1 = np.concatenate((out5,out6,out7), axis=0)
cv2.imshow("test1",inal)
cv2.imshow("test2",inal1)
cv2.imwrite("test1.jpg",inal)
cv2.imwrite("test2.jpg",inal1)
cv2.waitKey(0)


嗯。。区别还是挺明显的,不过我最喜欢最后那个实验结果图,尽管有些不完整,最起码背景不那么复杂,比较好处理。
上面那些图像的高低阈值是我自己随便设置的,主观依赖性比较大,下面试试自适应阈值的方法
def AdaptThresh():
grayimage = cv2.imread('00.jpg', 0)
thresh1 = cv2.adaptiveThreshold(grayimage, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
thresh2 = cv2.adaptiveThreshold(grayimage, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 31, 3)
thresh3 = cv2.adaptiveThreshold(grayimage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 13, 5)
thresh4 = cv2.adaptiveThreshold(grayimage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 4)
final = np.concatenate((thresh1, thresh2, thresh3, thresh4), axis=0)
cv2.imshow("test1", final)
cv2.imwrite("final.jpg", final)
cv2.waitKey(0)
结果如下

好像不太行,不顾哦最后一张图像的效果已经很好了,著所以看着乱是因为背景是白色的原因,如果将图像减去255,效果立马就能感觉出来,这里我就不试了。
def result():
gray_image = cv2.imread('00.jpg', 0)
ret, thresh1 = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow("test1", thresh1)
cv2.imwrite("rest.jpg",thresh1)
cv2.waitKey(0)
最后通过处理可以得到处理后的图像,如下所示

有干扰,尤其是左下角部分,但是整体上我们感兴趣的区域最起码可以看清了,而且效果还不错,应该不会影响对单个数字的分割,有兴趣的可以试试。
有时候许多图像的对比度较低,在进行特征区域的识别时较为困难,下面我们利用几种方法进行分析,如何提高图像的对比度。step 1:利用下面代码,看一下原图像#导包import cv2import numpy as npimport matplotlib.pyplot as plt#读取外部图像并显示def ReadAndShowImage(): image = cv2.imread("00.jpg") cv2.imshow("OriginImage", image) c
基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip
【资源介绍】
对于低亮度图像的增强
visual studio 2015 + Opencv3.3.1
针对的是图像,不是视频。实现的是原论文内容的前半部分。 test.cpp是源程序 test_1.bmp是待增强的图像 result.bmp是增强后的结果。
1. 背景
在CV领域,算法工(tiao)程(can)师(xia)经常会遇到训练数据不足或训练数据多样性太少的问题。此时,我们需要通过算法来进行数据扩充或数据增强。数据增强的方法有很多(如翻转、镜像、旋转、亮度增强等),本篇我们来讲一个最常用的数据增强策略:亮度增强。
2.亮度增强
本篇基于opencv对图片进行亮度增强,闲话少说,直接上代码:
import cv2
import random
import numpy as np
def data_augment(image, brightness):
在光线不足的情况下拍出好照片对非摄影师来说似乎很神奇。完成弱光摄影需要技巧、经验和合适的设备的结合。在低光下拍摄的图像缺乏色彩和独特的边缘。它们还存在能见度低和深度未知的问题。这些缺点使此类图像不适合个人使用或图像处理或计算机视觉任务。我们将学习改善夜间图像的照明。
对于没有摄影技能的人,我们可以使用图像处理技术来增强这些图像。Shi等人在他们的论文“使用亮/暗通道先验对单一图像进行夜间低照度图像增强”中提出了一种方法。这篇论文将作为这篇文章的基础。
在做检测过程中发现光照对于检测的精度影响很大,为了不增加采集标注数据工作量,增加了光照数据集来
增强检测效果。
代码1:选取需要光照
增强的区域,直接将像素值增加到240-255之间。
import cv2
import matplotlib.pyplot as plt
import random
img = cv2.imread('000100000910000000098.jpg')
h,w,c = img.shape
print(h,w)
start_x = 510
start_y = 1000
一、去逆光
逆光是拍摄时经常会出现的问题,我们的去逆光技术可以有效增强逆光状态下拍摄的图像质量,显著提高逆光状态下的人脸识别准确率。
链接1: OpenCV之光照补偿和去除光照
链接2: OpenCV高亮图片处理
二、低照度增强
在夜间,光照不足会导致图像的成像质量非常糟糕,低照度增强技术可以有效增强图像的亮度,恢复图像的细节,对于夜间的视频监控、车牌识别具有很大帮助。
链接3: OpenCV对低照度图像的增强
链接4: 低照度图像增强
三、去模糊
图像模糊处理选择突出或抑制图像中的部分特征,通过提升亮
def random_crop(img, area_ratio, hw_vari):
"""
:param img:
:param area_ratio: 裁剪画面占原画面比例(0,0.5)
:param hw
低照度图像增强是计算机视觉中一个重要的问题,而LIME算法是一种有效的低照度图像增强技术。在C语言实现LIME算法时,首先需要理解算法的原理和数学模型。
LIME算法的主要思路是将低照度图像分解为明亮部分和暗部分,对这两部分分别进行增强,最终将它们组合起来得到亮度更加均匀的图像。具体实现时,可以按照以下步骤进行:
1.将输入的低照度图像转换为灰度图像,并将其分为明暗两部分。
2.对明亮部分进行直方图均衡化(Histogram Equalization)处理,使图像中灰度级分布更加均匀。
3.对暗部分进行对比度增强,常采用的增强方法有拉伸(Stretch)和直方图匹配(Histogram Matching)。
4.将增强后的明暗两部分图像重新组合起来,得到最终的低照度图像增强结果。
在C语言中实现LIME算法时,可使用OpenCV等图像处理库进行图像读取和处理,并使用数学函数进行直方图均衡化和对比度增强等操作。同时,需要注意算法的效率和稳定性,避免出现算法实现中的bug和问题。
总之,低照度图像增强LIME算法在C语言实现涉及到多种图像处理方法和数学知识,需要仔细的实现和测试才能得到有效的增强结果。