【Python3+OpenCV】实现图像处理—灰度变换篇

本篇推文共计1000个字,阅读时间约3分钟。

OpenCV是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块。在Python中常使用OpenCV库实现图像处理。

本文将介绍如何在Python3中使用OpenCV实现对图像处理的灰度变换:

灰度化处理,二值化处理,伽马变换,对数变换反向变换

电脑环境准备

Python版本:

Python3.7

OpenCV版本:

OpenCV4.1

知识准备

一张图片是由像素点矩阵构成,我们对图片进行操作即为对图片的像素点矩阵进行操作。我们只要在这个像素点矩阵中找到这个像素点的位置,比如第x行,第y列。所以这个像素点在这个像素点矩阵中的位置就可以表示成(x,y)

同时因为一个像素点的颜色通常包括R、G、B三个分量,分别显示出红、绿、蓝三个颜色,灰度化就是使彩色图像的R、G、B三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素点比较亮,反之比较暗,像素值最大为255(表示白色),像素值最小为0(表示黑色)。

No.1

灰度化处理

Opencv中图片的灰度化:将一个像素点的三个颜色变量相等,R=G=B,此时该值称为灰度值。

本文提供的灰度化处理有两种方法(灰度化处理不止这两种)

方法1:直接将原图读成灰度图像

img1=cv2.imread('girl.png',0)
方法2:将原图进行灰度化处理
#灰度化处理2:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
import cv2

#读入原始图像
img=cv2.imread('girl.png',1)

#灰度化处理1:直接读入灰度化图像
img1=cv2.imread('girl.png',0)

#灰度化处理2:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img',img)
cv2.imshow('gray1',img1)
cv2.imshow('gray2',gray)

#暂停cv2模块 不然图片窗口一瞬间即就会消失 观察不到
cv2.waitKey(0)

运行程序后,显示如下:

No.2

二值化处理

Opencv中的图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。

cv.threshold ()函数是图像二值化函数

其中,第二个参数是判定像素点的临界值。超过了这个点,将会被划分为255,低于这个点,将会被划分为0。具体的参数0~255可以自行根据需要调节。

import cv2

#读入原始图像
img=cv2.imread('girl.png',1)

#灰度化处理
img1=gray.copy()

#灰度化处理:此灰度化处理用于图像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#二值化函数
cv2.threshold(gray,140,255,0,gray)#二值化函数

#通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('Binarization',gray)

#暂停cv2模块 不然图片窗口一瞬间即就会消失 观察不到
cv2.waitKey(0)

运行程序后,显示如下:

No.3

灰度图像的伽马变换

Opencv中的伽马变换是用来图像增强,提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

伽马值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分

伽马值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分

import cv2
import copy

#读入原始图像
img=cv2.imread('girl.png',1)

#灰度化处理
img1=cv2.imread('girl.png',0)

#灰度化处理:此灰度化处理用于图像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#伽马变换
gamma=copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
    for j in range(cols):
        gamma[i][j]=3*pow(gamma[i][j],0.8)

#通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('gamma',gamma)

#暂停cv2模块 不然图片窗口一瞬间即就会消失 观察不到
cv2.waitKey(0)

运行程序后,显示如下:

No.4

灰度图像的对数变换

Opencv中的对数变换:由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。可用于增强图像的暗部细节。

灰度图像的对数变换一般表示如公式所示:

DB=C*log(1+ DA)

其中c为尺度比较常数,DA为原始图像灰度值,DB为变换后的目标灰度值。

如下图所示,它表示对数曲线下的灰度值变化情况。

由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。这种变换可用于增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。

对数变换实现了扩展低灰度值而压缩高灰度值的效果,被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱,其动态范围可能宽达0~106直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失大量的暗部细节;而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。

import cv2
import copy
import math

#读入原始图像
img=cv2.imread('girl.png',1)

#灰度化处理
img1=cv2.imread('girl.png',0)

#灰度化处理:此灰度化处理用于图像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 对数变换
logc = copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
    for j in range(cols):
        logc[i][j] = 3 * math.log(1 + logc[i][j])

#通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('logc',logc)

#暂停cv2模块 不然图片窗口一瞬间即就会消失 观察不到
cv2.waitKey(0)

运行程序后,显示如下:

No.5

灰度图像的反色变换

Opencv中的反色变换:对原图像像素值的颜色进行反转,即黑色变为白色,白色变为黑色。

import cv2
import copy
import math

#读入原始图像
img=cv2.imread('girl.png',1)

#灰度化处理
img1=cv2.imread('girl.png',0)

#灰度化处理:此灰度化处理用于图像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 反色变换
cover=copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
    for j in range(cols):
        cover[i][j]=255-cover[i][j]

#通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('cover',cover)

#暂停cv2模块 不然图片窗口一瞬间即就会消失 观察不到
cv2.waitKey(0)

运行程序后,显示如下:

本期推文到此结束,欢迎各位读者关注本公众号。

本公众号将开设【Python3+OpenCV】专题,

并陆续推出相关系列文章,篇篇精彩。

欢迎读者给本公众号打个星标,让你每天学习新知识,探索人工智能的奥妙。

往期回顾

【Python3+OpenCV】实现图像处理—基本操作篇

【玩转华为云】教你用ModelArts实现数据集的图像标注

【玩转华为云】手把手教你ModelArts实现目标物体检测

【玩转华为云】基于ModelArts实现行人车辆检测

【玩转腾讯云】人脸融合,看你未来孩子长什么样

【玩转腾讯云】使用API快速构建文字识别小工具

架构师之路:星环大数据架构师的培训心得

武汉加油,中国加油!

欢迎各位读者在下方进行提问留言

☆ END ☆

你与世界

只差一个

公众号

扫描上方二维码,即可获取“编程学习资料”大礼包一份

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值