OpenCV-Python调整图像对比度和带文字白纸照片背景漂白方法

一、引言

在前面我们介绍了直方图均衡可以调整图像的对比度,那么还有没有其他方式调整对比度呢?答案是肯定的,今天就来招硬核的。

二、对比度调整的硬核方法

这招硬核方法就是参考灰度图像的阈值处理,我们知道灰度图像的阈值处理的基本思想是:

将图像中灰度值大于等于指定阈值的,将其设置为255,小于该值的设置为0。

不过阈值处理得到的是二值图,用于进行对比度增强必须进行调整。可以改成如下:
将图像中灰度值大于等于指定阈值的,将其灰度值设置为原灰度值+x,小于该值的设置为原灰度值-x。其中x为根据对比度调整需要设置的一个固定值。

三、调整的实现

在用数码相机等拍摄白纸的情况,得到的图像并不是真正的白纸,而是带不均匀灰度的浅灰色图片,这种情况需要进行调整才能得到比较合适的背景和前景。下面以一张白纸照片粘贴文字的图片作为处理对象,该图片如下:
在这里插入图片描述

下面用OpenCV-Python来实现上述算法:

import numpy as np
import cv2
from opencvPublic import preparePreviewImg,previewImgList,readImgFile

def adjustImgContrast():
    img = readImgFile(r'f:\pic\paper.jpg',True)
    bigmask = cv2.compare(img, np.uint8([127]), cv2.CMP_GE)
    smallmask = cv2.bitwise_not(bigmask)

    x = 90
    big = cv2.add(img, x, mask=bigmask)
    small = cv2.subtract(img, x, mask=smallmask)
    res = cv2.add(big, small)
    preparePreviewImg('输入图像:白纸照片', img, fontSize=38, color=(255, 255, 255))
    preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 255, 255))
    preparePreviewImg('调整对比度照片', res, fontSize=38, color=(255, 0, 0))
    previewImgList()
    print('\033[31m老猿Python网址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公众号:\033[34m老猿Python')

上述实现用了compare函数,也可以直接逐个像素处理。
我们来看处理结果:
在这里插入图片描述

可以看到处理后的图片效果比原图片效果好了很多,当然可以继续调大x的值得到更好的效果。

以上代码中,opencvPublic是老猿常用的图像处理自定义方法的公用模块,本文使用的自定义公用模块函数preparePreviewImg,previewImgList,readImgFile,cmpMatrix,print2DMatrix,其功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》中的介绍。

四、漂白白纸照片的方法

上面的图片进行了对比度的调整,但得到的背景并不是理想的白纸,背景色的灰度也不一致。下面提供一种这种图片处理变成纯白背景的更好实现方法。

漂白背景色的代码:

import cv2
from opencvPublic import preparePreviewImg,previewImgList,readImgFile

def adjustWhitePaperBG():
    img = readImgFile(r'f:\pic\paper.jpg', True)
    kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel1)
    div = np.float32(img) / (close)
    res = np.uint8(cv2.normalize(div, div, 0, 255, cv2.NORM_MINMAX))
    preparePreviewImg('输入图像:白纸照片', img, fontSize=38, color=(255, 255, 255))
    preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 255, 255))
    preparePreviewImg('输出图像:白纸', res, fontSize=38, color=(255, 0, 0))
    previewImgList()
    print('\033[31m老猿Python网址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公众号:\033[34m老猿Python')
    
adjustWhitePaperBG()

显示的输入、输出图像:
在这里插入图片描述

五、小结

本节介绍了一种利用阈值强制调整图像对比度的通用方法以及OpenCV-Python的实现,同时介绍了一个基于带文字的白纸照片对背景色进行漂白的案例,相关方法可以用于图像的增强。

参考资料

https://stackoverflow.com/questions/10549245/how-can-i-adjust-contrast-in-opencv-in-c

更多图像处理的内容请参考专栏《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》、《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》及《图像处理基础知识》的介绍。

如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值