UniPercept多模态大模型:实现感知级图像理解的突破
2026/5/6 4:57:30
图片缩放本质上是重新采样(Resampling)的过程。数字图片由一个个像素点组成,缩放时需要根据目标尺寸,计算出新画布上每个像素点的颜色值。
OpenCV 中通过cv2.resize()函数实现缩放,其核心是插值算法(不同算法对应不同的像素值计算方式),最常用的有以下几种:
| 算法类型 | 原理 | 特点 |
|---|---|---|
| 最近邻插值 | 新像素值 = 原图片中离目标位置最近的像素值(无计算,直接取) | 速度最快,锯齿感最强 |
| 双线性插值 | 取目标位置周围 4 个像素,通过线性加权计算新值(OpenCV 默认) | 速度较快,效果较平滑 |
| 双三次插值 | 取目标位置周围 16 个像素,通过三次多项式加权计算新值 | 速度慢,效果最细腻 |
假设原图片是 4×4 像素,要缩放到 2×2:
信息丢失的本质是:缩放改变了像素的采样密度,无法 100% 保留原图片的细节,具体分为两类:
放大本身不会丢失原信息,但会引入冗余 / 虚假信息:
cv2.INTER_AREA(区域插值),它专门针对下采样优化,比双线性 / 最近邻保留更多细节;cv2.INTER_CUBIC(双三次插值),虽然速度慢,但生成的像素更接近真实细节;# 高斯金字塔操作中的向下采样 #下采样 是一种减小图像尺寸的方法,它通常涉及到降低图像的分辨率,即减少图像中像素的数量,从而使图像看起来更小。 # 上采样是一种增大图像尺寸的方法,它通过插值和滤波技术来恢复图像的分辨率和细节,通常用于图像放大或者与下采样后的图像进行比较。 #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)图片直方图本质是统计每个像素值出现的频次:
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)直方图均衡化的本质是重新分配像素值: