OPENCV进阶1

图片放大缩小

图片缩放本质上是重新采样(Resampling)的过程。数字图片由一个个像素点组成,缩放时需要根据目标尺寸,计算出新画布上每个像素点的颜色值。

OpenCV 中通过cv2.resize()函数实现缩放,其核心是插值算法(不同算法对应不同的像素值计算方式),最常用的有以下几种:

1. 核心插值算法原理
算法类型原理特点
最近邻插值新像素值 = 原图片中离目标位置最近的像素值(无计算,直接取)速度最快,锯齿感最强
双线性插值取目标位置周围 4 个像素,通过线性加权计算新值(OpenCV 默认)速度较快,效果较平滑
双三次插值取目标位置周围 16 个像素,通过三次多项式加权计算新值速度慢,效果最细腻
2. 直观理解

假设原图片是 4×4 像素,要缩放到 2×2:

  • 最近邻插值:直接取原图片中 (0,0)、(0,2)、(2,0)、(2,2) 四个像素,丢弃其他像素;
  • 双线性插值:计算每个目标像素对应的原图片 “虚拟位置”(非整数坐标),再通过周围 4 个像素加权求和得到新值。

信息丢失的本质是:缩放改变了像素的采样密度,无法 100% 保留原图片的细节,具体分为两类:

1. 缩小图片(下采样):主动丢弃信息
  • 空间细节丢失:原图片的高频细节(如边缘、纹理、小物体)被合并 / 丢弃。例如:原图片中 1 个像素的细线,缩小后可能直接消失;
  • 像素信息丢失:多个原像素被合并为 1 个新像素,合并过程中(无论哪种插值)都会丢失部分像素的原始值;
  • 不可逆性:缩小后的图片无法通过放大恢复原始细节(放大只是 “猜测” 像素值,而非找回丢失的信息)。
2. 放大图片(上采样):被动生成 “假信息”

放大本身不会丢失原信息,但会引入冗余 / 虚假信息

  • 新像素值是通过插值 “计算” 出来的,并非真实存在的原始像素;
  • 放大后的图片会有模糊感(双线性 / 双三次)或锯齿感(最近邻),因为没有真实的高频细节支撑;
  • 例如:将 100×100 的图片放大到 200×200,新增的 10000 个像素都是算法 “猜” 的,而非原图的真实信息。
3. 关键结论:缩放的信息守恒
  • 缩小:信息总量减少(丢失细节);
  • 放大:信息总量不变(新增的是插值生成的冗余信息,而非真实信息);
  • 反复缩放:信息会持续丢失(缩小丢细节→放大补假信息→再缩小丢更多)。

如何减少缩放的信息丢失

  1. 缩小图片时:优先使用cv2.INTER_AREA(区域插值),它专门针对下采样优化,比双线性 / 最近邻保留更多细节;
  2. 放大图片时:优先使用cv2.INTER_CUBIC(双三次插值),虽然速度慢,但生成的像素更接近真实细节;
  3. 避免无意义缩放:尽量基于原图直接缩放到目标尺寸,而非 “缩小→放大” 反复操作;
  4. 高分辨率原图:如果需要频繁缩放,尽量保留高分辨率的原始图片,而非缩放后的低分辨率版本。
# 高斯金字塔操作中的向下采样 #下采样 是一种减小图像尺寸的方法,它通常涉及到降低图像的分辨率,即减少图像中像素的数量,从而使图像看起来更小。 # 上采样是一种增大图像尺寸的方法,它通过插值和滤波技术来恢复图像的分辨率和细节,通常用于图像放大或者与下采样后的图像进行比较。 #resize函数 是一种通用的图像尺寸调整方法,它可以按照指定的目标尺寸来缩放图像,不涉及金字塔结构或者特定的滤波操作。 # dst = cv2.pyrDown(src [,dst, dstsize [, borderType] ]) # dst:目标图像 # Src:原始图像 # dstsize:目标图像的大小 import cv2 face = cv2.imread('suki.jpg',cv2.IMREAD_GRAYSCALE)#GO cv2.imshow('face',face) cv2.waitKey(0) face_down_1 = cv2.pyrDown(face)#下采样G1 cv2.imshow('down_1',face_down_1) cv2.waitKey(0) face_down_2 = cv2.pyrDown(face_down_1)#62 cv2.imshow('down_2',face_down_2) cv2.waitKey(0) #高斯金字塔操作中的向上采样 # dst = cv2.pyrUp(src [,dst, dstsize [, borderType] ]) #dst:目标图像 #SrC:原始图像 #dstsi:目标图像的大小 face_up_1 = cv2.pyrUp(face) cv2.imshow('up_1',face_up_1)#fG1' cv2.waitKey(0) face_up_2 = cv2.pyrUp(face_up_1) cv2.imshow('up_2',face_up_2)#fG2' cv2.waitKey(0) ###对下采用后图像进行上采样,图像变模糊,无法复原 face_down_1_up = cv2.pyrUp(face_down_1)#下采样G1 face_down_2_up = cv2.pyrUp(face_down_2)#下采样G2 cv2.imshow('down_1_up',face_down_1_up) cv2.imshow('down_2_up',face_down_2_up) cv2.waitKey(0) ###拉普拉斯金字塔 L0 = face - face_down_1_up L1 = face_down_1 - face_down_2_up fuyuan = face_down_1_up + L0 cv2.imshow('L0',L0) cv2.imshow('L1',L1) cv2.waitKey(0) cv2.imshow('fuyuan',fuyuan) cv2.waitKey(0)

opencv对图片建立直方图

图片直方图本质是统计每个像素值出现的频次

  • 灰度图:统计 0(纯黑)~255(纯白)每个灰度值的像素数量;
  • 彩色图:分别统计 R、G、B 三个通道各自的像素值分布。OpenCV 中主要通过cv2.calcHist()函数实现,配合 Matplotlib 可以直观绘制直方图。

"___________________直方图__________________" # #cv2.calcHist(images,channeLs,mask,histSize,ranges) 计算图像的直方图,用于表示图像中像素灰度级别的分布情况.#images:原图像图像格式为uint8或foat32。当传入函数时应用中括号[]括来例如[img] # #channels:表示传入的图像通道数。如果输入图像是灰度图它的值就是[0]。如果是彩色图像的传入的参数可以是[0][1][2]它们分别对应着BGR。#mask:掩模图像。统计整幅图像的直方图就把它为None。但是如果你想统计图像某一部分的直方图,你就制作一个掩模图像并使用它。#histSize:BINS的数目。也需用中括号括来(分成多少个区间) # BINS:上面的直方图显示了每个像素值的像素数,即从0到255。即您需要256个值才能显示上述直方图。 # 但是请考虑一下,如果您不需要单独查找所有像素值的像素数,而是在像素值间隔内查找像素数,该怎么办?例如,您需要找到介于0到15之间的像素数,然后是16到31、32到47...、240到255。 # 您只需要16个值来表示直方图。 # #因此,只需将整个直方图拆分为 16个子部分,每个子部分的值就是其中所有像素计数的总和。这每个子部分都称为"BIN"。在第一种情况下,条柱数为256(每个像索一个),而在第二种情况下,官只有16。BINS 在OpenCV 文档中由术语nistSize表示#ranges:像素值范围常为[0256] import cv2 import matplotlib.pyplot as plt import numpy as np phone = cv2.imread('phone.png',cv2.IMREAD_GRAYSCALE) #将图像转换为一维数组 a = phone.ravel() #这里使用了numpy的ravel函数,将多维数组拉成一维数组。 #绘制直方图 plt.hist(a,bins=256) #使用matplotlib 的hist函数绘制直方图。 # 参数解释: #-a:一维数组,即图像的像素值组成的数组。 #-bins=256:指定直方图的条数,即灰度级的数量。 plt.show() ##显示直方图 phone_hist = cv2.calcHist([phone],[0],None, [16], [0,256]) plt.plot(phone_hist)#使用calcHist的值绘制曲线图 plt.show() img=cv2.imread('phone.png') color=('b','g','r') for i,col in enumerate(color): histr=cv2.calcHist([img], [i],None,[256],[0,256]) plt.plot(histr,color=col) plt.show() ###什么是mask?掩膜,pspr ###mask参数如何使用?mask为掩模图像,先来看一下mask效果 phone = cv2.imread('phone.png',cv2.IMREAD_GRAYSCALE) cv2.imshow('phone',phone) cv2.waitKey(0) mask = np.zeros(phone.shape[:2],np.uint8)#创建黑白图像,用于制作mask mask[50:350,100:470] = 255 cv2.imshow('mask',mask) cv2.waitKey(0) ##cv2.bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制"与"操作,1&1=1,1&0=0,01=0,0&0=0# # bitwise_and(src1, src2, dst=None, mask=None)参数: ##src1、Src2:为输入图像或标量,标src1和src2相与。 ##dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同 ##mask:图像掩膜,可选参数,用于指定要更改的输出图像数组的元素,mask为o的值,src1和Isrc2相与的值都为o. # 非的值,为SrC1和srC2相与的值。 Phone_mask = cv2.bitwise_and(phone,phone,mask=mask) cv2.imshow('phone_mask', Phone_mask) cv2.waitKey(0) phone_hist_mask = cv2.calcHist([phone],[0],mask,[256],[0,256]) plt.plot(phone_hist_mask)#使用calcHist的值绘制曲线图 plt.show()

OpenCV 读取的彩色图是BGR 格式(而非日常的 RGB),所以通道 0 是蓝色、1 是绿色、2 是红色,绘制时要对应正确的颜色。

直方图的实用场景

  • 分析图片亮度:直方图峰值偏左→图片偏暗,峰值偏右→图片偏亮;
  • 分析对比度:直方图分布越分散→对比度越高,集中在中间→对比度低;
  • 图像增强:基于直方图的均衡化(cv2.equalizeHist())可提升图片对比度;
  • 图像分割:通过直方图的波峰波谷,确定前景 / 背景的分割阈值。

直方图均衡化

'''------------------直方图均衡化-------------------''' # 真方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。 # 直方图均衡化通过将图像的像素值分布均匀化来实现这一目标。 # 在Python 0penCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。 # 该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。 import matplotlib.pyplot as plt black = cv2.imread('black.jpg',cv2.IMREAD_GRAYSCALE) ###phone_hist=cv2.calcHist([phone],[0],None,[256],[0,256]) plt.hist(black.ravel(),bins=256)#numpy中的ravel将数组多维度拉成一维数组 plt.show() black_equalize = cv2.equalizeHist(black) plt.hist(black_equalize.ravel(),bins=256) #numpy中的ravel将数组多维度拉成一维数组 plt.show() res =np.hstack((black,black_equalize)) # 横向拼接,将多个数组按水平方向(列顺序)堆叠成一个新的数组。 cv2.imshow('black_equalize',res) cv2.waitKey(0) ###自适应百方图均衡化(局部百方图处理,通过局部调整图像的直方图分布来提升图像的对比度和细节表现力,当需要保存细节特征,需要做局部处理## # cv2.createCLAHE([, clipLimit[, tileGridSize]]) retval ###参数说明: ###clipLimit:颜色对比度的阈值,可选项,默认值8 ###titleGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值(8,8) clahe = cv2.createCLAHE(clipLimit=10,tileGridSize=(8,8))#通过类创建了一个局部均衡化对象 black_clahe = clahe.apply(black) res = np.hstack((black,black_equalize,black_clahe)) cv2.imshow('black_equalize',res) cv2.waitKey(0)

直方图均衡化的本质是重新分配像素值

  1. 问题根源:低对比度图片的像素值会集中在一个狭窄的区间(比如都集中在 100-150),导致画面灰蒙蒙;
  2. 解决思路:将集中的像素值 “拉伸” 到 0-255 的全范围,让暗的更暗、亮的更亮;
  3. 数学逻辑:通过计算像素值的累积分布函数 (CDF),将原像素值映射到新的像素值,使新直方图的像素分布尽可能均匀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1191487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

农产品突围战:黄精企业破局之道

传统农产品如何突破低价竞争?区域特产怎样走向全国市场?今天我们来拆解一个黄精企业的商业化路径,看看他们如何用一套组合打法打开局面。一、市场痛点:好产品为何卖不出好价钱?产品同质化严重 多数农产品企业停留在原料…

【MPC】使用输入增量实现了不同的状态空间MPC公式研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

价值分配革命:洋酒商高增长背后的底层逻辑

在酒类行业普遍面临增长压力的背景下,福建某酒商在半年内实现显著盈利的表现值得关注。这一案例并非依靠大规模营销投入,而是通过调整价值分配方式,探索可持续的生态系统构建路径。一、行业面临的现实挑战获客成本结构性上升 电商平台流量分配…

2026 年最新版 Java 面试题及答案整理(纯干货,超详细)

程序员一步入中年,不知不觉便会被铺天盖地的“危机感”上身,曾经的那个少年已经不在,时间就是这样公平。就算你能发明 Java 语言,随着时间的推移,你注定还是要成为慢慢变蔫的茄子,缓缓变黑的葡萄。 看着秋…

救命!这款教学软件承包我所有课务✨

谁懂啊老师们😭 线上课卡到怀疑人生?学生走神摸鱼管不住?改作业改到深夜崩溃?课程被偷录盗卖更是心梗暴击!直到挖到魔果云课这个宝藏,直接解锁轻松教学模式,用过的老师都在疯狂建议✅✅直播丝滑…

“全栈模式”必然导致“质量雪崩”!和个人水平关系不大~

在经济下行的大背景下,越来越多的中小型企业开始放弃“前后端分离”的人员配置,开始采用“全栈式开发”的模式来进行研发费用的节省。 这方法真那么好吗? 作为一名从“全栈开发”自我阉割成“前端开发”的逆行研发,我有很多话想说…

ARM架构学习路径规划:新手入门必看建议

ARM架构学习路径规划:从零开始的实战指南 你是不是也曾面对“ARM架构”这个词感到既熟悉又陌生?它无处不在——你的手机、智能手表、路由器,甚至家里的智能灯泡里都有它的身影。但当你真正想深入学习时,却发现资料庞杂、门槛高、…

多波形输出发生器设计:三种波形切换方案

多波形输出发生器设计:三种波形切换方案的实战解析在电子系统开发中,信号源的设计从来都不是一件“简单的事”。尤其是当我们需要一个既能输出正弦波、又能随时切到方波或三角波的多波形发生器时,问题就从“能不能出波”变成了“怎么切得快、…

NX二次开发驱动PLC仿真:项目应用详解

NX二次开发驱动PLC仿真:从原理到实战的深度解析在智能制造浪潮席卷全球的今天,产线设计早已不再局限于“画完图纸等设备”的传统模式。越来越多的企业开始将数字孪生和虚拟调试作为新项目的标准流程。这其中,一个看似低调却极具威力的技术组合…

PEEK取代金属:精密注塑齿轮蜗杆驱动机器人灵巧手技术与成本革新

当人形机器人灵巧手从实验室走向千行百业,轻量化、低成本、低噪音的核心传动部件成为技术普及的关键瓶颈。传统金属齿轮蜗杆虽然性能可靠,却因重量大、加工复杂、摩擦噪音需求高等限制难以突破,而一场聚焦于灵巧手精密齿轮蜗杆传动部件革新的…

译码器学习

https://mp.weixin.qq.com/s/rhFpVGbRpzpjevP7I4a7oQhttps://mp.weixin.qq.com/s/rhFpVGbRpzpjevP7I4a7oQ 进制转换 十进制→二进制 利用“短除法”来列出这一计算过程 2 | 46 -> 0 ^ 低位---- |2 | 23 -> 1 |---- …

硬件电路电源设计:快速理解隔离与非隔离电源区别

硬件电路电源设计:搞懂隔离与非隔离,不再选错方案你有没有遇到过这样的问题——系统莫名其妙重启、传感器信号跳动剧烈、甚至设备外壳“带电”?很多时候,这些看似玄学的故障,根源就藏在电源设计里。而最关键的决策之一…

iverilog仿真入门必看:搭建第一个Verilog测试平台

从零开始:用iverilog搭建你的第一个Verilog测试平台 你有没有过这样的经历?写完一段Verilog代码,烧进FPGA却发现功能不对,信号飞了、时序乱了,查来查去不知道问题出在哪。别急——在动手做硬件之前, 先仿…

RS232接口引脚定义与电平匹配问题图解说明

RS232接口引脚定义与电平匹配:从踩坑到精通的实战指南你有没有遇到过这种情况?MCU代码写得一丝不苟,串口配置也反复核对,可设备就是“哑巴”——收不到数据、发出去的数据全是乱码,甚至一通电,MAX232芯片就…

智能物流系统架构的AI推理优化:架构师的6大策略

智能物流系统架构的AI推理优化:架构师的6大实战策略 ——从延迟优化到成本控制,全面提升物流AI效能 摘要/引言 在智能物流系统中,AI推理是驱动决策的“引擎”——从仓储机器人的实时避障、分拣系统的物品识别,到运输路径的动态…

职称小论文撰写遇上AI:从焦虑到从容的破局指南

去年冬天,我窝在书房里对着电脑屏幕发愁——职称评审截止日期只剩两周,小论文却卡在“如何降重”的环节。窗外飘着细雪,键盘敲击声混着暖气片的嗡嗡声,屏幕上重复率38%的红色数字刺得眼睛发酸。直到朋友推荐了PaperPass论文查重&a…

IL-4/IL-4R信号通路:过敏性炎症的核心驱动与治疗靶点

一、IL-4/IL-4R通路的生物学基础 白细胞介素-4及其受体是调控2型免疫反应的关键分子。IL-4R是一种属于红细胞生成素受体超家族的跨膜蛋白,其功能复合物的形成依赖于与IL-4的结合。IL-4主要通过与IL-4受体α亚基的高亲和力结合,继而招募不同的共亚基&…

麻了!00后在西二旗当街发简历推销自己?

小伙伴们好,我是小嬛。专注于人工智能、计算机视觉领域相关分享研究。【目标检测、图像分类、图像分割、目标跟踪等项目都可做,相关领域论文辅导也可以找我;需要的可联系(备注来意)】前两天在某音刷到一个视频&#xf…

AD画PCB低噪声电源分区设计深度剖析

用AD画PCB如何搞定低噪声电源设计?一位老工程师的实战笔记最近在调试一块高精度数据采集板时,又碰到了那个熟悉的老对手——ADC采样值跳动、信噪比始终上不去。示波器一抓电源轨,果然!3.3V模拟供电上爬满了高频毛刺,像…

在虚拟世界造车:数字孪生如何加速车型投产与工艺迭代?

在奥迪一汽智能生态工厂,工人们见证了一个奇特的景象:工厂在钢架林立之前,其数字孪生体已在云端历经了无数次的模拟运行与优化。机械九院的工程师们则早已习惯,在实体生产线安装前,于虚拟空间中验证每一次工艺布局。汽…