首页 > 技术文章 > opencv2图像处理--灰度变换

zhouzetian 2020-05-06 16:24 原文

图片是由像素点矩阵组成的,对图片的操作即为对像素点矩阵的操作。只要在这个像素点矩阵中找到这个像素点的位置,比如第x行,第y列,所以这个像素点在这个像素点矩阵中的位置就可以表示成(x,y),因为一个像素点的颜色由红、绿、蓝三个颜色变量表示(R,G,B),所以我们通过给这三个变量赋值,来改变这个像素点的颜色。

1:读入正常图片进行图片灰度处理

import cv2,copy, math
#读入原始图像
img = cv2.imread('1.jpg')
#灰度化处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("2.jpg", gray)

效果比对:

 

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

 2:对灰度图像进行二值化处理

# 二值化处理
ret, im_fixed = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)
cv2.imwrite("3.jpg", im_fixed)

二值化处理:将一个像素点的值突出为0,255,使得图片呈现黑白两种颜色。在灰度图像中像素值在0~255,二值化后图像中像素值为0或255。

CV_THRESH_BINARY, //表示如果当前像素点的灰度值大于阈值(50)则将输出图像的对应位置像素值置为255,否则为0

结果如下:

 

 3:对灰度图像进行伽马变换

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.6)

cv2.imwrite("4.jpg", gamma)

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

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

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

结果如下:

 

 

4:对灰度图像进行反色或者对数变换

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

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

 

# 对灰度图像进行对数变换
logc = copy.deepcopy(gray)
for i in range(rows):
    for j in range(cols):
        logc[i][j] = 3 * math.log(1 + logc[i][j])

cv2.imwrite("5.jpg", logc)

# 对灰度图像进行反色变换
cover = copy.deepcopy(gray)
for i in range(rows):
    for j in range(cols):
        cover[i][j] = 255 - cover[i][j]

cv2.imwrite("6.jpg", cover)

 

结果如下:

(反色变换)

 

 

(对数变换)

 

 

常用五种灰度图像处理方式:

# 超过阈值部分取maxval(最大值),否则取0
ret,thresh1 = cv2.threshold(gray_cat,127,255,cv2.THRESH_BINARY)
# THRESH_BINARY 的反转
ret,thresh2 = cv2.threshold(gray_cat,127,255,cv2.THRESH_BINARY_INV)
# 大于阈值的部分设为阈值,否则不变
ret,thresh3 = cv2.threshold(gray_cat,127,255,cv2.THRESH_TRUNC)
# 大于阈值的部分不改变,否则设为0
ret,thresh4 = cv2.threshold(gray_cat,127,255,cv2.THRESH_TOZERO)
# THRESH_TOZERO 的反转
ret,thresh5 = cv2.threshold(gray_cat,127,255,cv2.THRESH_TOZERO_INV)

推荐阅读