OpenCV图像处理-灰度处理

1、线性变换

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

在这里插入图片描述

#  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))等。
    在这里插入图片描述

2.1 对数变换

  • 对数变换可以增强低灰度值的像素,扩展低灰度区,压制高灰度值的像素,当希望对图像的低灰度区进行较大的拉伸而对高灰度区压缩时,可采用这种变换。
  • 因为对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,因此图像通过对数变换后,较暗区域的对比度将有所提高。可用于加强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。
    在这里插入图片描述
    在这里插入图片描述
# 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 指数变换

  • 指数变换(伽马变换)是用来图像加强,提高暗部细节,简单来讲就是经过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感觉的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正
  • 指数变换的表达式如式所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
# 指数变换
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、直方图处理

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

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

在这里插入图片描述

3.1 直方图均衡化

  • 直方图均衡的基本思想是对原始图像中的像素灰度做某种映射变换,使变换后图像灰度的概率密度是均匀分布的,即变换后图像是一幅灰度级均匀分布的图像,这意味着图像灰度的动态范围得到了增加,从而提高图像的对比度
  • 实现直方图均衡可以使用:cv2.equalizeHist(src)
    src要求是单通道图像
    对灰度图进行直方图均衡化如下:
    在这里插入图片描述
# 直方图均衡化
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))
    在这里插入图片描述
    在这里插入图片描述
# 彩色图像直方图均衡化
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)
    在这里插入图片描述
# 二值化
# 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中有两个方法可以实现图片的二值化:
    • 自适应阈值:自适应阈值可以看成一种局部阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白。
    • cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
    在这里插入图片描述
# 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)

在这里插入图片描述

  • 1
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
灰度直方图是一种常用的图像处理方法,可以用于图像增强、图像分割、图像匹配等方面。在OpenCV中,可以使用cv::calcHist函数计算图像的灰度直方图。具体操作如下: 1. 将图像转换为灰度图像,使用cv::cvtColor函数。 2. 定义直方图参数,如灰度级数目、直方图范围等。 3. 使用cv::calcHist函数计算图像的灰度直方图。 4. 可以使用cv::normalize函数将直方图归一化。 5. 可以使用cv::plot函数将直方图绘制出来。 下面是一个示例代码,计算并绘制图像的灰度直方图: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 读取图像 Mat image = imread("lena.jpg"); // 转换为灰度图像 Mat gray_image; cvtColor(image, gray_image, COLOR_BGR2GRAY); // 定义直方图参数 int histSize = 256; // 灰度级数目 float range[] = { 0, 256 }; const float* histRange = { range }; // 计算直方图 Mat hist; calcHist(&gray_image, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false); // 归一化直方图 normalize(hist, hist, 0, 1, NORM_MINMAX, -1, Mat()); // 绘制直方图 int hist_w = 512, hist_h = 400; int bin_w = cvRound((double)hist_w / histSize); Mat hist_image(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0)); for (int i = 1; i < histSize; i++) { line(hist_image, Point((i - 1) * bin_w, hist_h - cvRound(hist.at<float>(i - 1) * hist_h)), Point(i * bin_w, hist_h - cvRound(hist.at<float>(i) * hist_h)), Scalar(255, 0, 0), 2, LINE_AA); } // 显示图像和直方图 imshow("Image", image); imshow("Gray Image", gray_image); imshow("Histogram", hist_image); waitKey(); return 0; } ``` 在这个示例代码中,首先读取图像并转换为灰度图像,然后计算直方图并归一化,最后绘制出直方图并显示出来。你可以根据自己的需求修改参数和代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值