opencv2图像处理--灰度变换
图片是由像素点矩阵组成的,对图片的操作即为对像素点矩阵的操作。只要在这个像素点矩阵中找到这个像素点的位置,比如第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)