文章目录

  • 前言
  • 简介
  • 灰度变化
  • 线性变换
  • 指数
  • 对数
  • 直方图
  • 直方图均衡化
  • 空间滤波
  • 低通滤波
  • 高通滤波


前言

数字图像处理是计算机视觉的基础,许多经典的图像处理方法也在深度学习领域的模型结构设计思路有着借鉴,所以在此归纳学习内容,用简单的语言表达其思想。至于有效的使用经验、方法的原理公式,可以在《数字图像处理》冈萨雷斯版中寻找答案,内容太全面,且很多使用经验直接提供。

简介

灰度图是图像的基础,由0~255像素值组成,常见的彩色图是由rgb三通道构成,熟悉灰度图后可拓展至彩色图。(彩色空间不知rgb,还有hsv,CElab等)
灰度变换方法很多,一般称为图像增强。图像增强没有统一的标准衡量增强的好坏,也没有通用的方法放在四海皆准,需要根据具体问题和需求来灵活使用图像增强方法。
所以,也要求在进行传统数字图像处理时要真正理解不同变换方式和滤波方法的效果,便于更好得到需要效果。

灰度变化

逐像素计算,对每个像素点进行变换操作。

线性变换
  • 翻转
    opencv灰度图像转rgb图像公式_图像平滑
    s代表变换后像素值,c代表变换前像素值。
  • 线性变换
    opencv灰度图像转rgb图像公式_opencv灰度图像转rgb图像公式_02
    a, b是变换的线性系数, s是变换后像素值,c为变换前。
指数

也称gamma变换,进行显示校正。
opencv灰度图像转rgb图像公式_ci_03
s为指数变换后像素值,c为变换前,a为系数,r为指数

img = cv2.imread(filename)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img = cv2.resize(img,(600,400))

paras=[1.0,2.0,3.0,4.0,5.0]

plt.figure(figsize=(12,6))
plt.subplot(231)
plt.title("org pic")
plt.imshow(img)

for i, para in enumerate(paras):
	plt.subplot(232+i)
	plt.title('1/%.1f'%para)

    img1 = np.power(img/float(np.max(img)), 1/para)
	plt.imshow(img1)
	plt.tight_layout()
	plt.show()
对数

opencv灰度图像转rgb图像公式_opencv灰度图像转rgb图像公式_04
s为指数变换后像素值,c为变换前,a为系数

直方图

统计图像中像素值数量,观察图像分布情况。(反映图像亮度分布情况)

#coding:utf8

import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
import os

filename='lena.jpg' 
##------彩色直方图------##
img=cv2.imread(filename)
colors=['blue','green','red']

for i in range(3):
    hist,x=np.histogram(img[:,:,i].ravel(),bins=256,range=(0,256))
    plt.plot(0.5*(x[:-1]+x[1:]),hist,label=colors[i],color=colors[i])
    plt.show()
    
##------灰度直方图------##
img=cv2.imread(filename)
imgGrey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
colors=['grey']

for i in range(1):
    hist,x=np.histogram(imgGrey[:,:].ravel(),bins=256,range=(0,256))
	plt.plot(0.5*(x[:-1]+x[1:]),hist,label=colors[i],color=colors[i])
	plt.show()
直方图均衡化

直接效果是将像素分布均匀,降低对比度。

#coding:utf8
import cv2
import numpy as np

img = cv2.imread("欠曝光.png", 1)
(b, g, r) = cv2.split(img)

bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)

result = cv2.merge((bH, gH, rH))

cv2.imshow("dst", result)
cv2.imwrite("欠曝光直方图均衡.jpg",result)

空间滤波

低通滤波

将图像用空间卷积核进行卷积操作,将图像平滑去噪或者模糊。

## 图像平滑 ##
import cv2 
import numpy as np
from matplotlib import pyplot as plt 

img = cv2.imread('opencv_logo.png') 
kernel = np.ones((5,5),np.float32)/25 

dst = cv2.filter2D(img,-1,kernel) 
plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) 
plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([])
plt.show()

##----中值滤波----##
img_medianblur= cv2.medianBlur(img,5)
plt.subplot(343)
plt.title("media blur")
plt.imshow(img_medianblur)

residuals = img - img_medianblur;
plotResiduals(residuals,plt,344,"media blur residuals")
psnr=compare_psnr(imggt,img_medianblur)
print("media blur psnr:%f" %psnr)


##----非局部均值滤波----##
img_nonlocal= cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)

plt.subplot(347)
plt.title("non local mean")
plt.imshow(img_nonlocal)

residuals = img - img_nonlocal;
plotResiduals(residuals,plt,348,"non local mean residuals")
psnr=compare_psnr(imggt,img_nonlocal)
print("non local mean psnr:%f" %psnr)

高通滤波

获取图像边缘轮廓

  • 一阶滤波
##----高斯滤波----##
plt.figure(figsize=(16,10))
img_gaussian= cv2.GaussianBlur(img,(5,5),0)

plt.subplot(341)
plt.title("gauss blur")
plt.imshow(img_gaussian)

residuals = img - img_gaussian;
plotResiduals(residuals,plt,342,"gauss blur residuals")
psnr=compare_psnr(imggt,img_gaussian)
print("gauss blur psnr:%f"%psnr)
  • 二阶滤波
    二阶滤波对边缘和异常点敏感,常用于检测边缘和异常点。但一阶导数和二阶导数对噪声敏感,在处理前需要进行图像平滑处理降噪。
import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
img=cv2.imread('dave.jpg',0) 

#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致 np.uint8 
laplacian=cv2.Laplacian(img,cv2.CV_64F) 
# 参数 1,0 为只在 x 方向求一阶导数,最大可以求 2 阶导数。 
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5) 
# 参数 0,1 为只在 y 方向求一阶导数,最大可以求 2 阶导数。 
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) 

plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray') plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray') plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray') plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) plt.show()

最后是《数字图像处理》冈萨雷斯电子版:
链接:https://pan.baidu.com/s/149ORJH2xHZig424QxyLzCA
提取码:tg6m

opencv python版本电子版:
链接:https://pan.baidu.com/s/1YfsS14_H8XQBJIQ6C1Hqug
提取码:puu6