一、引言

      图像点运算也叫灰度变换,是图像处理基础操作。图像点运算仅针对单个像素灰度值独立计算,运算结果只由该像素原始值决定,与邻域像素无关。运算不会改变图像像素空间位置与几何结构,仅调整灰度分布,常用于亮度调节、对比度增强、灰度校正,按照g(x,y)=T(f(x,y))公式中变换函数T的性质可分为线性点运算与非线性点运算两类。

       下面通过一幅灰度图像pout,tif进行示范讲解,该图像的最小灰度值为74,最大灰度值为224,对比度不高,使用MATLAB和Python进行线性点运算和非线性点运算增强。

二、原始图像和MATLAB、Python程序实现

1.原始图像

2.MATLAB程序如下

clear all;
close all;
I=imread('pout.tif');
imshow(I);
Imaxvalue=max(I(:))
Iminvalue=min(I(:))
%I2=255/224*I;
I2=1.5*I;
%I22=imadjust(I,[74/255 224/255],[0 1]);%调整图像强度值
%figure,imshow(I22);
%figure,imhist(I22);
figure('Name','线性增强图像','NumberTitle','off');
subplot(2,2,1),imshow(I),title('原始图像');
subplot(2,2,2),imhist(I),title('原始图像灰度直方图');
subplot(2,2,3),imshow(I2),title('线性增强后图像');
subplot(2,2,4),imhist(I2),title('线性增强后灰度直方图');
% ------------------- 对数变换 -------------------
I_double = double(I);          % 先转double避免计算溢出
I3 = log(1 + I_double);        % 对数变换
I3max=max(I3(:));
I3min=min(I3(:));
% 归一化到 [0,1],拉伸到标准灰度范围
I3_norm = (I3 - min(I3(:))) / (max(I3(:)) - min(I3(:)));
% 转换为uint8(可选,使类型与原始图像一致,直方图x轴为0-255)
I3 = uint8(255 * I3_norm);     

figure('Name','使用对数函数增量图像','NumberTitle','off');
subplot(2,2,1),imshow(I),title('原始图像');
subplot(2,2,2),imhist(I),title('原始图像灰度直方图');
subplot(2,2,3),imshow(I3),title('对数变换后增强后图像'); % 无需[],I3已是标准灰度
subplot(2,2,4),imhist(I3),title('对数变换后增强后灰度直方图');

3.MATLAB程序运行主要运行结果

 

4.Python程序

import cv2 #导入OpenCV库
import numpy as np
import matplotlib.pyplot as plt

# 读取灰度图像
I = cv2.imread('d:\pout.tif', cv2.IMREAD_GRAYSCALE)
if I is None:
    raise FileNotFoundError("图像pout.tif未找到")

# 显示原始图像(简单显示)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.show()  # 为了模仿MATLAB的imshow显示,但也可以后续一起显示

# 计算最大最小值
Imaxvalue = I.max()
Iminvalue = I.min()
print(f"Imaxvalue: {Imaxvalue}")
print(f"Iminvalue: {Iminvalue}")

# 线性增强
I2 = 1.5 * I  # 会变成float64,之后clip并转为uint8
I2 = np.clip(I2, 0, 255).astype(np.uint8)

# 创建图形窗口1
plt.figure('Linear Enhancement')
plt.subplot(2,2,1)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(2,2,2)
plt.hist(I.ravel(), bins=256, range=(0,255), color='gray')
plt.title('Original Histogram')
plt.xlabel('Pixel value')
plt.ylabel('Frequency')

plt.subplot(2,2,3)
plt.imshow(I2, cmap='gray')
plt.title('Linear Enhanced Image')
plt.axis('off')

plt.subplot(2,2,4)
plt.hist(I2.ravel(), bins=256, range=(0,255), color='gray')
plt.title('Linear Enhanced Histogram')
plt.xlabel('Pixel value')
plt.ylabel('Frequency')

plt.tight_layout()

# 对数变换
I_double = I.astype(np.float64)
I3 = np.log1p(I_double)  # log(1+I)
I3_norm = (I3 - I3.min()) / (I3.max() - I3.min())
I3 = (255 * I3_norm).astype(np.uint8)

# 创建图形窗口2
plt.figure('Logarithmic Transformation')
plt.subplot(2,2,1)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(2,2,2)
plt.hist(I.ravel(), bins=256, range=(0,255), color='gray')
plt.title('Original Histogram')
plt.xlabel('Pixel value')
plt.ylabel('Frequency')

plt.subplot(2,2,3)
plt.imshow(I3, cmap='gray')
plt.title('Log Transformed Image')
plt.axis('off')

plt.subplot(2,2,4)
plt.hist(I3.ravel(), bins=256, range=(0,255), color='gray')
plt.title('Log Transformed Histogram')
plt.xlabel('Pixel value')
plt.ylabel('Frequency')

plt.tight_layout()

plt.show()

5.Python程序主要运行结果

三、结果与讨论

       通过对MATLAB和Python两种开发语言实现了pout.tif灰度图像的线性点运算和非线性点运算,调整了图像的灰度分布,增强了对比度。从上面可以看出,MATLAB的语句相对简洁一些,且不需要导入库;使用Python需要提前安装OpenCV库方可运行。在Python中安装OpenCV库最常用的方法是使用pip命令pip install opencv-python。

      撰写博客不易,如果你觉得本文对你的学习和工作有过帮助,请点赞和关注,欢迎转发。谢谢!

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐