欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数字图像处理--灰度变换和空间滤波

程序员文章站 2022-04-22 11:50:20
文章目录前言简介灰度变化线性变换指数对数直方图直方图均衡化空间滤波低通滤波高通滤波前言数字图像处理是计算机视觉的基础,许多经典的图像处理方法也在深度学习领域的模型结构设计思路有着借鉴,所以在此归纳学习内容,用简单的语言表达其思想。至于有效的使用经验、方法的原理公式,可以在《数字图像处理》冈萨雷斯版中寻找答案,内容太全面,且很多使用经验直接提供。简介灰度图是图像的基础,由0~255像素值组成,常见的彩色图是由rgb三通道构成,熟悉灰度图后可拓展至彩色图。(彩色空间不知rgb,还有hsv,CElab等)...



前言

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

简介

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

灰度变化

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

线性变换

  • 翻转
    s=255cs = 255 - c
    s代表变换后像素值,c代表变换前像素值。

  • 线性变换
    s=ac+bs = a * c + b
    a, b是变换的线性系数, s是变换后像素值,c为变换前。

指数

也称gamma变换,进行显示校正。
s=acrs = a * c ^ r
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() 

对数

s=alog(c+1)s = a * log(c + 1)
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://blog.csdn.net/helloworld_Fly/article/details/108248778