OpenCV图像处理-灰度处理

这篇具有很好参考价值的文章主要介绍了OpenCV图像处理-灰度处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、线性变换

  • 灰度的线性变换将图像中的所有像素点的值按线性变换函数进行变换。
  • 在曝光不足或过度的情况下,图像的灰度值会局限在一个很小的范围内,这时在显示器上看到的将是一个模糊不清、似乎没有层次的图像。
  • 针对这一情况,使用一个线性单值函数对图像内的每一个像素做线性扩展,将有效地改善图像的视觉效果
  • 线性变换原理如图所示。
    OpenCV图像处理-灰度处理
    根据上图,以曝光不足为例,假设原图像f(x,y)的灰度范围是[a,b],期望经过灰度线性变换后得到的图像g(x,y)灰度范围是[c,d],则线性变换过程如下式所示。
    OpenCV图像处理-灰度处理
    更普遍的数学表示是:
    OpenCV图像处理-灰度处理
    其中,g(x, y)为变换后的值,a为系数,b为常数项。

OpenCV图像处理-灰度处理

#  1、线性变换
import cv2
import numpy as np

img = cv2.imread('img.jpg')
cv2.imshow('image', img)
# cv2.waitKey(0)
# 线性变换
linear_img = 1.5 * img + 10
linear_img.max()    # 最大值364.0
# 截断,把大于255的像素值变为255
linear_img[linear_img>255] = 255
linear_img = np.asarray(linear_img, np.uint8) # 像素值变为整数
cv2.imshow('linear image', linear_img)
cv2.waitKey(0)

2、非线性变换

  • 使用非线性函数对图像灰度进行映射,可实现图像灰度的非线性变换,常用的有对数函数和指数函数典型的有对数函数(图(a))、指数函数(图(b))等。
    OpenCV图像处理-灰度处理

2.1 对数变换

  • 对数变换可以增强低灰度值的像素,扩展低灰度区,压制高灰度值的像素,当希望对图像的低灰度区进行较大的拉伸而对高灰度区压缩时,可采用这种变换。
  • 因为对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,因此图像通过对数变换后,较暗区域的对比度将有所提高。可用于加强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。
    OpenCV图像处理-灰度处理
    OpenCV图像处理-灰度处理
# 2. 非线性变换
# 对数变换
log_img = 10 + 20 * np.log(img+5)
# 截断,把大于255的像素值变为255
log_img[log_img>255] = 255    
log_img = np.asarray(log_img, np.uint8) # 像素值变为整数
cv2.imshow('log_image', log_img)
cv2.imshow('image', img)
cv2.waitKey(0)

2.2 指数变换

  • 指数变换(伽马变换)是用来图像加强,提高暗部细节,简单来讲就是经过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感觉的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正
  • 指数变换的表达式如式所示。
    OpenCV图像处理-灰度处理
    OpenCV图像处理-灰度处理
    OpenCV图像处理-灰度处理
# 指数变换
gamma_img = 10 * np.power(img, 1.1)
# 截断,把大于255的像素值变为255
gamma_img[gamma_img>255] = 255    
# 像素值变为整数
gamma_img = np.asarray(gamma_img, np.uint8) 
cv2.imshow('gamma_image', gamma_img)
cv2.imshow('image', img)
cv2.waitKey(0)

3、直方图处理

  • 图像的灰度直方图如图所示,用横坐标表示灰度级,纵坐标表示各个灰度级出现的像素数。
  • 通过灰度直方图可以反映图像灰度的统计特性,以及图像中不同灰度值的面积或像素数在整幅图像中所占的比例。
    OpenCV图像处理-灰度处理
  • 如图所示的两个灰度直方图中,若直方图密集地分布在很窄的区域之内,说明图像的对比度很低;若直方图有两个峰值,则说明图像中有可能存在两种不同亮度的区域。
    OpenCV图像处理-灰度处理
  • 直方图是图像的一维特征,一个图像具有唯一的直方图。图像直方图灰度级的分布形态可以提供图像信息的许多特征,为图像分析提供一个有力的论据。
  • 查看图像的直方图分布: plt.hist(src.ravel(),hitsizes, ranges, color)
    OpenCV图像处理-灰度处理
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 图像的灰度直方图
img = cv2.imread('img.jpg')
# 绘制灰度直方图
plt.hist(img.ravel(), 256, [0,255])

OpenCV图像处理-灰度处理

3.1 直方图均衡化

  • 直方图均衡的基本思想是对原始图像中的像素灰度做某种映射变换,使变换后图像灰度的概率密度是均匀分布的,即变换后图像是一幅灰度级均匀分布的图像,这意味着图像灰度的动态范围得到了增加,从而提高图像的对比度
  • 实现直方图均衡可以使用:cv2.equalizeHist(src)
    src要求是单通道图像
    对灰度图进行直方图均衡化如下:
    OpenCV图像处理-灰度处理
# 直方图均衡化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 转为灰度图
img_hist = cv2.equalizeHist(img_gray)   # 对单通道图像进行均衡化
cv2.imshow('gray', img_gray)
cv2.imshow('hist', img_hist)
cv2.waitKey(0)

3.2 彩色图像直方图均衡化

  • 若要对多通道的图像进行直方图均衡,首先将原图的通道单独分割,然后分别进行直方图均衡,最后把处理完成的各个单通道图像合并即可。
  • 通道分割可以通过cv2.split()实现,比如:b, g, r = cv2.split(img)
  • 通道合并类似数组的合并,通过cv2.merge()实现,比如:cv2.merge((bH, gH, rH))
    OpenCV图像处理-灰度处理
    OpenCV图像处理-灰度处理
# 彩色图像直方图均衡化
def EqualizeHist(img):
    # 1. 拆分通道
    (b, g, r) = cv2.split(img)
    # 2. 分别对每个通道进行均衡化
    bh = cv2.equalizeHist(b)
    gh = cv2.equalizeHist(g)
    rh = cv2.equalizeHist(r)
    # 3. 合并
    result = cv2.merge((bh, gh, rh))
    return result

# 对原图进行直方图均衡化
img_equal = EqualizeHist(img)
cv2.imshow('image', img)
cv2.imshow('image_equal', img_equal)
cv2.waitKey(0)
# 绘制直方图
plt.hist(img_equal.ravel(), 256, [0,255])

4、二值化

  • 二值化是值将图像只保留黑白二色,非黑即白。
    • 彩色图像:三个通道,像素值0-255,0-255,0-255,所以可以有2^24位空间
    • 灰度图像:一个通道,像素值0-255, 所以有256种颜色
    • 二值图像:只有两种颜色,黑和白,255白色,0黑色
  • 图像二值化(Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
  • 在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
  • OpenCV中有两个方法可以实现图片的二值化:
    • 阈值截断:选取一个全局阈值,以此值为界限把整幅图像分成非黑即白的二值图像。
    • cv2.threshold(src, thresh, maxval, type)
    OpenCV图像处理-灰度处理
# 二值化
# 1. 阈值截断
img = cv2.imread('img.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, img_binary = cv2.threshold(src=img_gray, thresh=50, maxval=255,
                         type=cv2.THRESH_BINARY)
cv2.imshow('image_binary', img_binary)
cv2.imshow('image', img)
cv2.waitKey(0)

OpenCV图像处理-灰度处理

  • OpenCV中有两个方法可以实现图片的二值化:
    • 自适应阈值:自适应阈值可以看成一种局部阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白。
    • cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
    OpenCV图像处理-灰度处理
# 2.自适应阈值
adapt_thres = cv2.adaptiveThreshold(src=img_gray, maxValue=255,
                              adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                              thresholdType=cv2.THRESH_BINARY,
                              blockSize=9, C=3)
cv2.imshow('adapt image', adapt_thres)
cv2.waitKey(0)

OpenCV图像处理-灰度处理文章来源地址https://www.toymoban.com/news/detail-481511.html

到了这里,关于OpenCV图像处理-灰度处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Opencv 图像处理:图像基础操作与灰度转化

    Opencv 图像处理:图像基础操作与灰度转化

    本文已收录于Opencv系列专栏: 深入浅出OpenCV ,专栏旨在详解Python版本的Opencv,为计算机视觉的开发与研究打下坚实基础。免费订阅,持续更新。 1.图像格式 图像压缩比: 通过编码器压缩后的图象数字大小和原图象数字大小的压缩比。 BMP 格式 Windows系统下的 标准位图格式 ,

    2024年02月04日
    浏览(18)
  • 【OpenCV】 基础入门(二)图像基础概念 | 图像灰度化处理 | 图像二值化处理

    【OpenCV】 基础入门(二)图像基础概念 | 图像灰度化处理 | 图像二值化处理

      在计算机中用一般用 M x N 的矩阵来表示一幅尺寸大小为 M x N 的数字图像,矩阵元素的值就是该图像对应位置上的像素值。    对于计算机本地磁盘中的彩色图像,单机鼠标右键,选择“属性”,可以看到一幅图像的基本信息。 1、灰度图:   灰度图是每个像素只有一

    2024年04月14日
    浏览(14)
  • OpenCV常用功能——灰度处理和图像二值化处理

    1.1 cvtColor函数 函数原型: 功能 :转换图像颜色空间。 参数 : src: 输入图像。 code: 颜色空间转换代码。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。 dst: 输出图像。 dstCn: 输出图像的通道数,如果设置为0,则跟随转换代码自动设置。 内置函数示例代码: 灰度处理的原理是将

    2024年02月08日
    浏览(12)
  • python图像处理实战(二)—二值化图像与线性变换

    python图像处理实战(二)—二值化图像与线性变换

    🚀写在前面🚀 🖊个人主页:https://blog.csdn.net/m0_52051577?type=blog  🎁欢迎各位大佬支持点赞收藏,三连必回!! 🔈本人新开系列专栏—python图像处理 ❀愿每一个骤雨初晴之时,所有的蜻蜓振翅和雨后惊雷,都归你。 前言         首先引入以下灰度变换的概念。      

    2024年02月07日
    浏览(14)
  • C#使用OpenCv(OpenCVSharp)图像处理实例:亮度、对比度、灰度

    本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行亮度、对比度、灰度处理。 目录 亮度和对比度原理 灰度 实例 图像亮度通俗理解便是图像的明暗程度,数字图像 f(x,y) = i(x,y) r(x, y) ,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越

    2024年02月13日
    浏览(14)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(17)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(50)
  • 《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

    《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 几何变换分为等距变换、相似变换、仿射变换和投影变换,是指对图像的位置、大小、形状和投影进行变换,将图像从原始平面投影到新的视平面。OpenCV图像的几

    2024年02月04日
    浏览(65)
  • 【Python图像处理篇】opencv中的仿射变换和透视变换

    【Python图像处理篇】opencv中的仿射变换和透视变换

    仿射变换可以将矩形图片映射为平行四边形, 透视变换可以将矩形图片映射为任意四边形。 opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective, 使用这两个函数可以实现所有类型的变换。 cv2.warpAffine 接收的参数2x3的变换矩阵; 而 cv2.warpPerspective 接收的3x3的变换矩阵。

    2024年01月24日
    浏览(49)
  • OpenCV图像处理之傅里叶变换

    OpenCV图像处理之傅里叶变换

    傅里叶变换: 目的就是得到图像的低频和高频,然后针对低频和高频进行不同的处理。处理完之后,在通过逆变换恢复到图像,这时候对低频和高频的处理就会反映到图像上。 频率 高频:变化剧烈的灰度分量,例如边界。 低频:变化缓慢的灰度分量,例如一天蓝天(相似的

    2024年02月06日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包