您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 |

自学教程:python之数字图像处理方式

51自学网 2023-06-16 18:56:12
  python
这篇教程python之数字图像处理方式写得很实用,希望能帮到您。

基本概念

  • 数字图像定义

对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,x 轴向右,和笛卡尔坐标系x轴相同;y 轴向下,和笛卡尔坐标系y轴相反。

这样我们可将一幅图像定义为一个二维函数 f(x,y),图像中的每个像素就可以用 (x,y) 坐标表示,而在任何一对空间坐标 (x,y) 处的幅值 f 称为图像在该点的强度或灰度,当 x,y 和灰度值 f 是有限离散数值时,便称该图像为 数字图像 

:f的取值为区间[Lmin,Lmax],也将其称为图像的灰度级,实际情况下常常令该区间为[0,L-1],其中f=0时为黑色,f=1时在灰度级中为白色,所有中间值是从黑色到白色之间变化的灰度色调,而图像最高和最低灰度级之间的灰度差便为对比度

:图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性。 

  • 亮度

图像亮度通俗理解便是图像的明暗程度,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。

  • 对比度

指的是图像暗和亮的落差值,即图像最大灰度级和最小灰度级之间的差值

  • 饱和度

饱和度指的是图像颜色种类的多少, 上面提到图像的灰度级是[Lmin,Lmax],则在Lmin、Lmax 的中间值越多,便代表图像的颜色种类多,饱和度也就更高,外观上看起来图像会更鲜艳,调整饱和度可以修正过度曝光或者未充分曝光的图片。使图像看上去更加自然

  • 锐化

图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。图像锐化在实际图像处理中经常用到,因为在做图像平滑,图像滤波处理的时候经过会把丢失图像的边缘信息,通过图像锐化便能够增强突出图像的边缘、轮廓

  • 分辨率

就是每英寸图像内有多少个像素点

图像增强

概述:主要分为空间域增强和频率域增强,本文主要介绍空间域增强方法:也就是直接对图片像素进行处理。

整体代码

import mathimport cv2import numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['FangSong']  # 设置字体以便正确显示汉字plt.rcParams['axes.unicode_minus'] = False  # 正确显示连字符MEDTH_ID=8# 计算图片清晰度def getImageVar(img):    img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转化成灰度图    # 对图片用 3x3 拉普拉斯算子做卷积得到边缘  计算出方差,并最后返回。    # 函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以建立的图像位数不够,会有截断。因此要使用64位有符号的数据类型,即 cv2.CV_64F。    # 再用var函数求方差    imageVar = cv2.Laplacian(img2gray, cv2.CV_64F).var()    return imageVar# 转接器def handle(idx, img):    if idx == 1: return handle_specific(img, linear) # 线性变化    if idx == 2: return handle_specific(img, linear_up) # 分段线性变化    if idx == 3: return handle_specific(img, Logarithmic) # 对数变换    if idx == 4: return handle_specific(img, power) # 幂指变换    if idx == 5: return handle_specific(img, cv2.equalizeHist)  # 直方图均衡化    if idx == 6: return handle_specific(img, auto_equalizeHist)  # 自适应直方图均衡化    if idx == 7: return handle_specific(img, laplacian)  # laplacian算子图像锐化    if idx == 8: return handle_specific(img, non_sharpening)  # 非锐化掩蔽# 处理函数def handle_specific(img, func):    img_list = [func(i) for i in cv2.split(img)]    result = cv2.merge((img_list[0], img_list[1], img_list[2]))    return result# 线性变化def linear(img):    a, b = 1.5, 0    for i in range(img.shape[0]):        for j in range(img.shape[1]):            if img[i][j] * a + b > 255:                img[i][j] = 255            else:                img[i][j] = img[i][j] * a + b    return img# 分段线性变换-线性对比度拉伸,增强感兴趣区域def linear_up(img):    # 灰度值的最大最小值    r_min, r_max = 255, 0    for i in range(img.shape[0]):        for j in range(img.shape[1]):            if img[i, j] > r_max:                r_max = img[i, j]            if img[i, j] < r_min:                r_min = img[i, j]    r1, s1 = r_min, 0    r2, s2 = r_max, 255    k = (s2 - s1) / (r2 - r1)    for i in range(img.shape[0]):        for j in range(img.shape[1]):            if r1 <= img[i, j] <= r2:                img[i, j] = k * (img[i, j] - r1)    return img# 对数变换def Logarithmic(img):    for i in range(img.shape[0]):        for j in range(img.shape[1]):            img[i][j] = math.log(1+img[i][j])    cv2.normalize(img, img, 0, 255, cv2.NORM_MINMAX)    img = cv2.convertScaleAbs(img)    return img# 对数变换def power(img):    for i in range(img.shape[0]):        for j in range(img.shape[1]):            img[i][j] = math.pow(img[i][j],1.2)    cv2.normalize(img, img, 0, 255, cv2.NORM_MINMAX)    img = cv2.convertScaleAbs(img)    return img# 自适应的直方图均衡化-非线性的对比度拉伸,增强感兴趣区域def auto_equalizeHist(img):    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))    img = clahe.apply(img)    return imgdef laplacian(img):    kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])  # laplacian卷积核的一个模板    lapkernel_img = cv2.filter2D(img, -1, kernel) # 做卷积    img = img - lapkernel_img    return imgdef non_sharpening(img):    blur_img = cv2.blur(img, (5, 5))    mask_img = img - blur_img    img = img + mask_img    return imgimg = cv2.imread(filename='img/CB.61.20211203152034_crop_0.jpg', flags=1)result = handle(MEDTH_ID, img)print('原图的清晰度:', getImageVar(img))print('处理之后的清晰度', getImageVar(result))fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)axes[0].imshow(img)axes[0].set_title("原图")axes[1].imshow(result)axes[1].set_title("处理之后的图片")plt.show()

线性变换

  • 用处

线性变换主要可以对图像的对比度和亮度进行调整(但是比较暴力),线性变换公式如下: f ( x , y ) = f ( x , y ) ∗ a + b f(x,y)=f(x,y)*a+b f(x,y)=f(x,y)∗a+b,参数 a 影响图像的对比度,参数 b 影响图像的亮度,具体分为可分为以下几种情况:

  • a>1:增强图像的对比度,图像看起来更加清晰
  • a<1: 减小了图像的对比度, 图像看起来变暗,
  • b>0:增加图像的亮度,图像变亮,
  • b<0:减少图像的亮度,图像变暗
  • a=-1 and b=255:图像翻转

a=1.5,b=0的结果:

分段线性变换

  • 对比度拉伸

将原图的灰度范围限制为自定义范围,增强感兴趣区域。如将原来的 [ l m i n , l m a x ] [l_{min},l_{max}] [lmin
Python虚拟机中描述器的王炸应用分享
懒人必备Python代码之自动发送邮件

51自学网自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1