python图像对比处理_图像处理 | 灰度变换与图像对比度拉伸
一、问题与解决思路
图像实质上就是一个包含了许多像素点的矩阵。
具体计算过程如下:
通过min()函数以及max()函数分别求出处理前原图像的灰度级最小值与最大值;
对原图像进行归一化处理,即用【图像矩阵元素-处理前灰度级最小值】除以【处理前灰度级最大值-处理前灰度级最小值】;
将图像灰度级放缩至我们指定的预期期间,即用【处理后的灰度级最小值】加上“ 【步骤3中归一化处理后的结果】乘以【处理后的灰度级最大值-处理后的灰度级最小值】 ”;
将处理后的图像转为uint8类型以便于正确显示。
二、Python 实现代码
1) 核心函数:
from PIL import Image
from pylab import *
# 自定义图像对比度拉伸函数 myGrayScaleTransformJ
def myGrayScaleTransformJ(img1, para):
# 若输入不合法,返回原图像
if (para[0] < 0 or para[1] > 255 or para[0] > para[1]):
img2 = Image.fromarray(uint8(img1))
return img2
# min_after,max_after 分别表示拉伸后灰度级区间的最小值与最大值
min_after = para[0]
max_after = para[1]
# min_before,max_before 分别表示处理前灰度级区间的最小值与最大值
min_before = img1.min()
max_before = img1.max()
# 1、将处理前的图像灰度级进行归一化处理
temp = (img1 - min_before) / (max_before - min_before)
# 2、将图像的灰度级放缩至我们指定的预期区间
img2 = min_after + (temp * (max_after - min_after))
# 3、转成uint8 类型以便正确显示
img2 = Image.fromarray(uint8(img2))
return img2
2) 主函数:
from PIL import Image
from pylab import *
import matplotlib.pyplot as plt
import MyModule
# 以下两行代码解决图片标题中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
img = Image.open("EXP1A.tif").convert("RGB") # 读入图像 .convert("RGB")解决灰度图像失真问题
plt.subplot(121) # 划分为1行2列,先画左边第一个
plt.axis('off')
plt.title('原图像')
plt.imshow(img) # 画出原图像
imgArr = array(Image.open("EXP1A.tif").convert("RGB")) # 读入图像并转为数组
# 读入para数组,即预期拉伸的灰度级区间范围,para1为最小值,para2为最大值
print ("请分别输入预期拉伸的灰度级区间范围的最小值与最大值(空格隔开):")
arr = input("")
para = [int(n) for n in arr.split()]
enhancedImg = MyModule.myGrayScaleTransformJ(imgArr, para) # 调用自定义函数进行线性拉伸
plt.subplot(122)
plt.axis('off')
plt.title('处理后')
plt.imshow(enhancedImg) # 画出处理后的图像
plt.show()
注意点:
使用 Python 进行图像处理需导入第三方依赖,而 Matlab 则可以直接调用官方的工具包
from PIL import Image
上方语句中的 PIL 用于完成图像的基本处理,如读取图像到程序中,默认为 uint8 类型
from pylab import *
需导入上方依赖才能将图像转换为数组
三、Matlab 实现代码
1) 核心函数
% img1:处理前的灰度图像;img2:处理后的灰度图像
% para(1)表示拉伸后灰度级区间的最小值
% para(2)表示拉伸后灰度级区间的最大值
function img2 = myGrayScaleTransformJ(img1,para)
% 若输入不合法,则返回原图像
if (para(1)<0 || para(2)>255 || para(1)>para(2))
img2 = img1;
return;
end
img1 = double(img1);
% min_after,max_after分别表示拉伸后灰度级区间的最小值与最大值
min_after = para(1);
max_after = para(2);
% min_before,max_before分别表示处理前灰度级区间的最小值与最大值
min_before = min(img1(:));
max_before = max(img1(:));
% 1、将处理前的图像灰度级进行归一化处理
temp = (img1 - min_before) ./ (max_before - min_before);
% 2、将图像的灰度级放缩至我们指定的预期区间
img2 = min_after + temp .* (max_after - min_after);
% 转成uint8类型以便正确显示
img2 = uint8(img2);
end
2) 主函数:
clc;
clear all;
img1 = imread('EXP1A.tif');
% 画出原来的图像
subplot(2,2,1);
imshow(img1);
title('A:raw img');
% 输入数据并调用函数
min = input('请输入拉伸后的灰度级最小值:');
max = input('请输入拉伸后的灰度级最大值:');
para = [min, max];
img2 = myGrayScaleTransformJ(img1, para);
% 画出将对比度线性拉伸后的图像
subplot(2,2,2);
imshow(img2);
title('A:enhanced img');
3) 运行效果:
原文链接:https://blog.csdn.net/qq_45716120/article/details/109126628
python图像对比处理_图像处理 | 灰度变换与图像对比度拉伸相关推荐
- java 图像刺绣算法_图像处理:OpenCV3源代码文件解析
引言 结合冈萨雷斯的<数字图像处理>和Opencv3.0,学习图像处理算法有一段时间了,知道了函数怎么使用,但不知道opencv所用的函数源代码是如何编写的,"知其然,也要知其所 ...
- python检测屏幕亮点_图像处理之坏点校正及源码实现
1 坏点介绍 图像坏点(Bad pixel) : 图像传感器上光线采集点(像素点)所形成的阵列存在工艺上的缺陷,或光信号进行转化为电信号的过程中出现错误,从而会造成图像上像素信息错误,导致图像中的像素 ...
- cnn生成图像显著图_使用CNN生成图像先验实现场景的盲图像去模糊
论文链接:https://arxiv.org/abs/1803.03363 CVPR2018 摘要 提出了一种基于数据驱动的判别先验的盲图像去模糊方法.此项工作是基于这样一个事实:一个好的图像先验应该 ...
- python图像对比_Python多种图像处理库的比较与比较
我帮助在libvips wiki 上维护一个页面,比较20个左右的常用图像处理库,以便快速和内存使用,包括相当多的Python系统. 基准测试非常简单:加载5,000 x 5,000像素RGB TIF ...
- python图片矢量化_图像处理tas的Python矢量化
我在用python3(这个特定任务的NumPy)自学彩色图像处理.在 我有一个3d张量,代表图像中每个像素的RGB值,所以它的形状是(高,宽,3).在每个像素处,我要生成新的RGB值,这些值是给定像素 ...
- python翻译成中文_图像处理入门 100 题,有人把它翻译成了中文版!
红色石头的个人网站: 红色石头的个人博客-机器学习.深度学习之路www.redstonewill.com 之前,我发文推荐过一份图像处理入门 100 题,主要针对图像处理的一些基本操作,非常适合入门 ...
- 利用python对图像进行傅里叶变换_(九)OpenCV-Python学习—图像傅里叶变换
对于二维图片,可以对其进行傅里叶变换,获取图片的频谱信息.频谱有很多应用,包括显著性检测,卷积定理,频率域滤波等,下面是图片傅里叶变换的一些基本概念: 1. 图像傅里叶变换 对于M行N列的图像矩阵f( ...
- matlab将二值图像与原图重叠_图像处理matlab及图像融合图像镶嵌图像拼接
要把double的图像(范围是0到1)再次转化为256灰度值的,可以这样 Igrey= uint8(I2*255) 图像类型转换函数: dither() 通过颜色抖动,把真彩图像转换成索引图像或灰度图 ...
- 图像标注技巧_保护互联网上图像的一个简单技巧
图像标注技巧 补习 (TUTORIAL) Have you ever worried about sharing your images on the Internet? Anytime you up ...
最新文章
- eclipse提示在***类中找不到main方法
- 深入解析windows XP/2003:内核模式和用户模式
- 只用html5与CSS做一个简单的页面,HTML+CSS基础训练之做一个简单页面的布局
- Customing 维护中TR弹出逻辑
- Java解析XMl文件之SAX和DOm方法
- 过滤序列,惰性序列_Java 8的惰性序列实现
- 设计一个程序实现两个任意长的整数的求和运算_自然数集,整数集,有理数集等都有字母表示,为什么无理数集没有...
- 浙江移动智能语音服务器,接口说明
- nginx+php简单配置环境
- Android完美适配dimens.xml脚本
- pureftp在企业中的应用及配置
- 【C++】《C++ Primer Plus》--复习题、编程练习题答案
- Python 散点图的数据分析
- linux版虚拟示波器,借你一双慧眼——DSCope虚拟示波器评测
- ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
- [蓝桥杯]分解质因数
- 荣耀note10无缘鸿蒙,赵明确认荣耀NOTE10 真机参数疑似全曝光!
- Python输入密码
- Python数据分析基础之Excel文件(6)
- 在 Adob​​e MAX 深入研究 UI/UX 设计
热门文章
- matlab用博德稳定性判据,自编劳斯判据判断系统稳定性的Matlab函数
- STM32 发送字符串至淘晶驰串口屏显示到txt控件——避坑
- ndnSIM学习(二)——配置VScode的跨文件转到定义
- linux rdac管理,Linux® RDAC Multipath Drivers
- php 文件大小转换,php 中以B,KB,MB,GB 表示文件大小的方法
- [从0开始机器学习]8.过拟合问题和正则化方法
- 前端开发工具 —— VSCode - Snipaste - Photoshop - Fireworks - Icomoon字库
- SQLiteStudio | 使用SQL语句操作表格
- 双蛋问题的递归解法和循环解法
- 射击类小游戏讲解:太空大战