当前位置: 首页 > news >正文

襄阳网站建设营销培训网页

襄阳网站建设营销,培训网页,网页设计与自学教程,云南省住房和城乡建设厅网站首页专栏地址#xff1a;『youcans 的图像处理学习课』 文章目录#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】6. 灰度变换与直方图处理 文章目录【youcans 的图像处理学习课】6. 灰度变换与直方图处理1. 图像增强技术2. 图像的灰度化处理和二… 专栏地址『youcans 的图像处理学习课』 文章目录『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】6. 灰度变换与直方图处理 文章目录【youcans 的图像处理学习课】6. 灰度变换与直方图处理1. 图像增强技术2. 图像的灰度化处理和二值化处理例程1.47 图像的二值变换固定阈值3. 图像的灰度变换3.1 反色变换图像反转例程1.48 图像的反色变换3.2 线性灰度变换例程1.49 图像的线性灰度变换3.3 分段线性灰度变换例程1.50 分段线性灰度变换对比度拉伸例程1.53 分段线性灰度变换灰度级分层例程1.54 分段线性灰度变换比特平面分层3.4 非线性灰度变换对数变换和指数变换例程1.55 图像的对数变换3.5 非线性灰度变换幂律变换伽马变换例程1.56 图像的幂律变换4. 图像的直方图处理4.1 灰度直方图例程1.57 图像的灰度直方图4.2 直方图均衡化例程1.58 直方图均衡4.3 直方图匹配例程1.59 灰度图像直方图匹配例程1.60 彩色图像直方图匹配4.4 局部直方图处理基本例程1.61 自适应的局部直方图均衡4.5 直方图统计量图像增强基本例程1.63 直方图统计量图像增强4.6 直方图反向投影反向追踪基本例程1.64 直方图反向投影追踪1. 图像增强技术 图像增强Image Enhancement的方法主要有空间域变换、频率域变换和伪彩色处理。 空间域变换空间域是指图像平面空间域的图像处理方法直接对图像的像素点进行处理。空间域图像处理技术主要是灰度变换和空间滤波。频率域变换 通过傅立叶变换在频率域进行处理然后再转换回空间域。伪彩色处理把灰度图像映射到彩色空间常用于遥感图像、医学影像处理。 2. 图像的灰度化处理和二值化处理 按照颜色对图像进行分类可以分为二值图像、灰度图像和彩色图像。 二值图像只有黑色和白色两种颜色的图像。每个像素点可以用 0/1 表示0 表示黑色1 表示白色。灰度图像只有灰度的图像。每个像素点用 8bit 数字 [0,255] 表示灰度如0 表示纯黑255 表示纯白。彩色图像彩色图像通常采用红色R、绿色G和蓝色B三个色彩通道的组合表示。 OpenCV 中彩色图像使用 BGR 格式。彩色图像进行灰度化处理可以在读取图像文件时直接读取为灰度图像也可以通过颜色空间转换函数 cv2.cvtColor 将彩色图像转换为灰度图像。 灰度化处理相关函数和例程介绍详见 [OpenCV 学习课-2.图像读取与显示]。 # 1.1 图像的读取imgFile ../images/imgLena.tif # 读取文件的路径img1 cv2.imread(imgFile, flags1) # flags1 读取彩色图像(BGR)img2 cv2.imread(imgFile, flags0) # flags0 读取为灰度图像# 1.10 图像显示(plt.imshow)imgRGB cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) # 图片格式转换BGR(OpenCV) - RGB(PyQt5)imGray cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 图片格式转换BGR(OpenCV) - Gray 进一步地通过函数 cv2.threshold 可以对图像进行二值化处理。 函数说明 cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst函数 threshold() 可以将灰度图像转换为二值图像图像完全由像素 0 和 255 构成呈现出只有黑白两色的视觉效果。 灰度阈值化通过选取的灰度阈值 thresh将每个像素的灰度值与阈值进行比较将灰度大于阈值的像素点置为最大灰度小于阈值的像素点置为最小灰度得到二值图像可以突出图像轮廓把目标从背景中分割出来。 参数说明 scr变换操作的输入图像nparray 二维数组必须是单通道灰度图像thresh阈值取值范围 0~255maxval填充色取值范围 0255一般取 255type变换类型 cv2.THRESH_BINARY大于阈值时置 255否则置 0cv2.THRESH_BINARY_INV大于阈值时置 0否则置 255cv2.THRESH_TRUNC大于阈值时置为阈值 thresh否则不变保持原色cv2.THRESH_TOZERO大于阈值时不变保持原色否则置 0cv2.THRESH_TOZERO_INV大于阈值时置 0否则不变保持原色cv2.THRESH_OTSU使用 OTSU 算法选择阈值 返回值 retval返回二值化的阈值返回值 dst返回阈值变换的输出图像 注意 函数 cv2.threshold 进行固定阈值的二值化处理函数 cv2.adaptiveThreshold 为自适应阈值的二值化处理函数可以通过比较像素点与周围像素点的关系动态调整阈值。 确切地说只有 type 为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV 时输出为二值图像其它变换类型时进行阈值处理但并不是二值处理。 例程1.47 图像的二值变换固定阈值 # 1.47 固定阈值二值变换img cv2.imread(../images/imgLena.tif) # 读取彩色图像(BGR)imgGray cv2.imread(../images/imgLena.tif, flags0) # flags0 读取为灰度图像# imgGray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 颜色转换BGR(OpenCV) - Gray# cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dstret1, img1 cv2.threshold(imgGray, 63, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh63ret2, img2 cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh127ret3, img3 cv2.threshold(imgGray, 191, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh191ret4, img4 cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY_INV) # 逆二值图像BINARY_INVret5, img5 cv2.threshold(imgGray, 127, 255, cv2.THRESH_TRUNC) # TRUNC 阈值处理THRESH_TRUNCret6, img6 cv2.threshold(imgGray, 127, 255, cv2.THRESH_TOZERO) # TOZERO 阈值处理THRESH_TOZEROplt.figure(figsize(9, 6))titleList [1. BINARY(thresh63), 2. BINARY(thresh127), 3. BINARY(thresh191), 4. THRESH_BINARY_INV, 5. THRESH_TRUNC, 6. THRESH_TOZERO]imageList [img1, img2, img3, img4, img5, img6]for i in range(6):plt.subplot(2, 3, i1), plt.title(titleList[i]), plt.axis(off)plt.imshow(imageList[i], gray) # 灰度图像 ndim2plt.show()3. 图像的灰度变换 灰度变换是图像增强的重要方法可以使图像动态范围扩大、图像对比度增强图像更清晰特征更明显从而改善图像的显示效果。 灰度变换就是按一定规则灰度映射函数修改图像每一个像素的灰度值从而改变图像灰度的动态范围。按照灰度映射函数的性质灰度变换可以分为线性变换、分段线性和非线性变换非线性变换中对数变换、指数变换和幂律变换n次幂、n次根最为常用。常见的灰度变换函数的形状如下图所示。 3.1 反色变换图像反转 图像的反色变换即图像反转将黑色像素点变白色白色像素点变黑色。广义的反色变换也可以应用于彩色图像即对所有像素点取补。 图像的反转处理可以增强暗色区域中的白色或灰色细节。 注意图像反转Invert与图像翻转Flip的区别图像翻转是沿对称轴的几何变换像素值不变图像反转是像素颜色的逆转像素位置不变。 例程1.48 图像的反色变换 # 1.48 图像的反色变换img cv2.imread(../images/imgLena.tif) # 读取彩色图像(BGR)imgGray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 颜色转换BGR(OpenCV) - Grayh, w img.shape[:2] # 图片的高度和宽度# imgInv np.zeros_like(img) # 创建与 img 相同形状的黑色图像imgInv np.empty((w, h), np.uint8) # 创建空白数组for i in range(h):for j in range(w):imgInv[i][j] 255 - imgGray[i][j]plt.figure(figsize(10,6))plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title(imgBGR), plt.axis(off)plt.subplot(132), plt.imshow(imgGray, cmapgray), plt.title(imgGray), plt.axis(off)plt.subplot(133), plt.imshow(imgInv, cmapgray), plt.title(imgInv), plt.axis(off)plt.show()3.2 线性灰度变换 线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 线性灰度变化对图像的每一个像素作线性拉伸可以凸显图像的细节提高图像的对比度。 线性灰度变换可以由以下公式描述 Dtd−cb−a[D−a]cαDβ\begin{align} Dt \frac{d-c}{b-a}[D-a]c\\ \alpha D \beta \end{align} Dt​b−ad−c​[D−a]cαDβ​​ 式中D 为原始图像的灰度值Dt 为线性灰度变换后的图像灰度值。 当 α1β0\alpha 1\beta 0α1β0 时保持原始图像不变当 α1β0\alpha 1\beta 0α1β0 时图像的灰度值上移灰度图像颜色发白彩色图像颜色发亮当 α1β0\alpha 1\beta 0α1β0 时图像的灰度值下移灰度图像颜色发黑彩色图像颜色发暗当 α1\alpha1α1 时图像的对比度增强当 0α10 \alpha 10α1 时图像的对比度减小当 α0β255\alpha 0\beta255α0β255 时图像暗区域变亮亮区域变暗图像求补当 α−1β255\alpha -1\beta 255α−1β255 时图像的灰度值反转 直方图正规化是根据图像的最小灰度级和最大灰度级将其拉伸到灰度级全域 [0,255] 的线性变换。 例程1.49 图像的线性灰度变换 # 1.49 图像的线性灰度变换img cv2.imread(../images/imgLena.tif) # 读取彩色图像(BGR)imgGray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 颜色转换BGR(OpenCV) - Grayh, w img.shape[:2] # 图片的高度和宽度img1 np.empty((w, h), np.uint8) # 创建空白数组img2 np.empty((w, h), np.uint8) # 创建空白数组img3 np.empty((w, h), np.uint8) # 创建空白数组img4 np.empty((w, h), np.uint8) # 创建空白数组img5 np.empty((w, h), np.uint8) # 创建空白数组img6 np.empty((w, h), np.uint8) # 创建空白数组# Dt[i,j] alfa*D[i,j] betaalfa1, beta1 1, 50 # alfa1,beta0: 灰度值上移alfa2, beta2 1, -50 # alfa1,beta0: 灰度值下移alfa3, beta3 1.5, 0 # alfa1,beta0: 对比度增强alfa4, beta4 0.75, 0 # 0alfa1,beta0: 对比度减小alfa5, beta5 -0.5, 0 # alfa0,beta0: 暗区域变亮亮区域变暗alfa6, beta6 -1, 255 # alfa-1,beta255: 灰度值反转for i in range(h):for j in range(w):img1[i][j] min(255, max((imgGray[i][j]beta1), 0)) # alfa1,beta0: 颜色发白img2[i][j] min(255, max((imgGray[i][j]beta2), 0)) # alfa1,beta0: 颜色发黑img3[i][j] min(255, max(alfa3*imgGray[i][j], 0)) # alfa1,beta0: 对比度增强img4[i][j] min(255, max(alfa4*imgGray[i][j], 0)) # 0alfa1,beta0: 对比度减小img5[i][j] alfa5*imgGray[i][j]beta5 # alfa0,beta255: 暗区域变亮亮区域变暗img6[i][j] min(255, max(alfa6*imgGray[i][j]beta6, 0)) # alfa-1,beta255: 灰度值反转plt.figure(figsize(10, 6))titleList [1. imgGray, 2. beta50, 3. beta-50, 4. alfa1.5, 5. alfa0.75, 6. alfa-0.5]imageList [imgGray, img1, img2, img3, img4, img5]for i in range(6):plt.subplot(2, 3, i 1), plt.title(titleList[i]), plt.axis(off)plt.imshow(imageList[i], vmin0, vmax255, cmapgray)plt.show()3.3 分段线性灰度变换 分段线性变换函数可以增强图像各部分的反差增强感兴趣的灰度区间、抑制不感兴趣的灰度级。 分段线性函数的优点是可以根据需要拉伸特征物的灰度细节一些重要的变换只能用分段函数来描述和实现缺点则是参数较多不容易确定。 分段线性函数通用公式如下 Dt{caD,0≤Dad−cb−a[D−a]c,a≤D≤bf−de−b[D−a]d,bD≤eDt \begin{cases} \dfrac{c}{a} D , 0 \leq D a\\ \dfrac{d-c}{b-a}[D-a]c , a \leq D \leq b\\ \dfrac{f-d}{e-b}[D-a]d , b D \leq e\\ \end{cases} Dt⎩⎨⎧​ac​Db−ad−c​[D−a]ce−bf−d​[D−a]d​,0≤Da,a≤D≤b,bD≤e​ 式中D 为原始图像的灰度值Dt 为线性灰度变换后的图像灰度值。 例程1.50 分段线性灰度变换对比度拉伸 对比度拉伸可以扩展图像中的灰度级范围从而覆盖设备的理想灰度范围。 对比度拉伸变换函数可以有不同的实现方案如将原始灰度范围拉伸到较宽的灰度范围或将原始灰度范围拉伸到全域灰度范围0255或将原始灰度范围拉伸到较宽的灰度范围同时对下限或上限进行截断处理。 本例程令 (r1, s1) (rMin, 0)、(r2, s2) (rmax, L-1)其中 rMin、rMax 表示图像中最小灰度值和最大灰度值将原始图像的灰度级分段线性拉伸到整个范围 [0, L-1]。运行结果的左图显示本例程的拉伸变换曲线。 # 1.50 分段线性灰度变换 (对比度拉伸)imgGray cv2.imread(../images/Fig0310b.tif, flags0) # flags0 读取为灰度图像height, width imgGray.shape[:2] # 图片的高度和宽度# constrast stretch, (r1,s1)(rMin,0), (r2,s2)(rMax,255)rMin imgGray.min() # 原始图像灰度的最小值rMax imgGray.max() # 原始图像灰度的最大值r1, s1 rMin, 0 # (x1,y1)r2, s2 rMax, 255 # (x2,y2)imgStretch np.empty((width, height), np.uint8) # 创建空白数组k1 s1 / r1 # imgGray[h,w] r1:k2 (s2-s1) / (r2-r1) # r1 imgGray[h,w] r2k3 (255-s2) / (255-r2) # imgGray[h,w] r2for h in range(height):for w in range(width):if imgGray[h,w] r1:imgStretch[h,w] k1 * imgGray[h,w]elif r1 imgGray[h,w] r2:imgStretch[h,w] k2 * (imgGray[h,w] - r1) s1elif imgGray[h,w] r2:imgStretch[h,w] k3 * (imgGray[h,w] - r2) s2plt.figure(figsize(10,3.5))plt.subplots_adjust(left0.2, bottom0.2, right0.9, top0.8, wspace0.1, hspace0.1)plt.subplot(131), plt.title(sT(r))x [0, 96, 182, 255]y [0, 30, 220, 255]plt.plot(x, y)plt.axis([0,256,0,256])plt.text(105, 25, (r1,s1), fontsize10)plt.text(120, 215, (r2,s2), fontsize10)plt.xlabel(r, Input value)plt.ylabel(s, Output value)plt.subplot(132), plt.imshow(imgGray, cmapgray, vmin0, vmax255), plt.title(Original), plt.axis(off)plt.subplot(133), plt.imshow(imgStretch, cmapgray, vmin0, vmax255), plt.title(Stretch), plt.axis(off)plt.show()例程1.53 分段线性灰度变换灰度级分层 灰度级分层可以突出图像中特定的灰度级区间可以对灰度级进行分层处理。 灰度级分层有两种常用方案一种方案是二值处理将感兴趣的灰度级区间设为较大的灰度值其它区间设为较小的灰度值另一种方案是窗口处理将感兴趣的灰度级区间设为较大的灰度值其它区间不变。 两种灰度级分层方案的分段变换公式分别为 Dt1{d,a≤D≤bc,elseDt2{d,a≤D≤bD,elseDt_1 \begin{cases} d , a \leq D \leq b\\ c , else \end{cases} \\ Dt_2 \begin{cases} d , a \leq D \leq b\\ D , else \end{cases} Dt1​{dc​,a≤D≤b,else​Dt2​{dD​,a≤D≤b,else​ 式中D 为原始图像的灰度值Dt1、Dt2 为灰度变换后的图像灰度值。 例程 1.53 对于肾部区域主动脉血管造影图像采用灰度级分层技术增强主要血管将感兴趣的灰度级区间显示为白色。方案一进行二值化处理将其它灰度区间设为黑色方案二则保留其它灰度区间的灰度值不变。 # # 1.53 分段线性灰度变换 (灰度级分层) # Gray layeredimgGray cv2.imread(../images/Fig0312a.tif, flags0) # flags0 读取为灰度图像width, height imgGray.shape[:2] # 图片的高度和宽度# Gray layered strategy 1: binary imagea, b 155, 245 # 突出 [a, b] 区间的灰度imgLayer1 imgGray.copy()imgLayer1[(imgLayer1[:,:]a) | (imgLayer1[:,:]b)] 0 # 其它区域黑色imgLayer1[(imgLayer1[:,:]a) (imgLayer1[:,:]b)] 255 # 灰度级窗口白色# Gray layered strategy 2: grayscale imageimgLayer2 imgGray.copy()imgLayer2[(imgLayer2[:,:]a) (imgLayer2[:,:]b)] 255 # 灰度级窗口白色其它区域不变plt.figure(figsize(10, 6))plt.subplot(131), plt.imshow(imgGray, cmapgray), plt.title(Original), plt.axis(off)plt.subplot(132), plt.imshow(imgLayer1, cmapgray), plt.title(Binary layered), plt.axis(off)plt.subplot(133), plt.imshow(imgLayer2, cmapgray), plt.title(Grayscale layered), plt.axis(off)plt.show()例程1.54 分段线性灰度变换比特平面分层 像素值也可以表示为二进制形式对 8bits 二进制数的每一位进行切片可以得到 8 个比特平面称为比特平面分层Bit-plane slicing。 通常高阶比特平面包含了大量有视觉意义的数据而低阶比特平面包含了更精细的灰度细节。因此比特平面分层可以用于图像压缩和图像重建。 # # 1.54 分段线性灰度变换 (比特平面分层) Bit-plane slicingimg cv2.imread(../images/Fig0726a.tif, flags0) # flags0 读取为灰度图像height, width img.shape[:2] # 图片的高度和宽度# imgRec np.zeros((height, width), dtypenp.uint8) # 创建零数组plt.figure(figsize(10, 8))for l in range(9, 0, -1):plt.subplot(3, 3, (9-l)1, xticks[], yticks[])if l9:plt.imshow(img, cmapgray), plt.title(Original)else:imgBit np.empty((height, width), dtypenp.uint8) # 创建空数组for w in range(width):for h in range(height):x np.binary_repr(img[w,h], width8) # 以字符串形式返回输入数字的二进制表示形式x x[::-1]a x[l-1]imgBit[w,h] int(a) # 第 i 位二进制的值plt.imshow(imgBit, cmapgray)plt.title(f{bin((l-1))})plt.show()3.4 非线性灰度变换对数变换和指数变换 对数变换可以由以下公式描述 Dtc∗log(1D)Dt c * log(1D) Dtc∗log(1D) 对数曲线在像素值较低的区域斜率大在像素值较高的区域斜率小。对数变换将输入中范围较窄的低灰度值映射为范围较宽的灰度级输入中的高灰度值则被映射为范围较窄的灰度级。对数变换后较暗区域的对比度提升可以增强图像的暗部细节。 对数变换实现了扩展低灰度值而压缩高灰度值的效果广泛应用于频谱图像的显示中。对数变换的典型应用是傅立叶频谱的动态范围很宽直接显示时受显示设备动态范围的限制而丢失大量的暗部细节使用对数变换将图像的动态范围进行非线性压缩后就可以清晰地显示。 例程1.55 图像的对数变换 # 1.55 图像的非线性灰度变换对数变换img cv2.imread(../images/Fig0305a.tif, flags0) # flags0 读取为灰度图像normImg lambda x: 255. * (x-x.min()) / (x.max()-x.min()1e-6) # 归一化fft np.fft.fft2(img) # 傅里叶变换fft_shift np.fft.fftshift(fft) # 中心化amp np.abs(fft_shift) # 傅里叶变换的频谱amp np.uint8(normImg(amp)) # 映射到 [0, 255]ampLog np.abs(np.log(1 np.abs(fft_shift))) # 对数变换ampLog np.uint8(normImg(ampLog)) # 映射到 [0, 255]plt.figure(figsize(9, 5))plt.subplot(131), plt.imshow(img, cmapgray, vmin0, vmax255), plt.title(Original), plt.axis(off)plt.subplot(132), plt.imshow(amp, cmapgray, vmin0, vmax255), plt.title(FFT spectrum), plt.axis(off)plt.subplot(133), plt.imshow(ampLog, cmapgray, vmin0, vmax255), plt.title(FFT spectrum - log trans), plt.axis(off)plt.tight_layout()plt.show()3.5 非线性灰度变换幂律变换伽马变换 幂律变换也称伽马变换可以提升暗部细节对发白曝光过度或过暗曝光不足的图片进行矫正。 幂律变换可以由以下公式描述 Dtc∗(Dϵ)γDt c * (D\epsilon)^{\gamma} Dtc∗(Dϵ)γ 伽马变换本质上是对图像矩阵中的每个值进行幂运算。$ 0 \gamma 1$ 时拉伸图像中灰度级较低的区域压缩灰度级较高的部分增加图像的对比度γ1\gamma 1γ1 时拉伸图像中灰度级较高的区域压缩灰度级较低的部分降低图像的对比度。 伽马变换通过非线性变换对人类视觉特性进行补偿最大化地利用有效的灰度级带宽。很多拍摄、显示、打印设备的亮度曲线都符合幂律曲线因此伽马变换广泛应用于各种设备显示效果的调校称为伽马校正。 例程1.56 图像的幂律变换 # 1.56 图像的非线性灰度变换: 幂律变换 (伽马变换)img cv2.imread(../images/imgB2.jpg, flags0) # flags0 读取为灰度图像gammaList [0.125, 0.25, 0.5, 1.0, 2.0, 4.0] # gamma 值normImg lambda x: 255. * (x-x.min()) / (x.max()-x.min()1e-6) # 归一化为 [0,255]plt.figure(figsize(9,6))for k in range(len(gammaList)):imgGamma np.power(img, gammaList[k])imgGamma np.uint8(normImg(imgGamma))plt.subplot(2, 3, k1), plt.axis(off)plt.imshow(imgGamma, cmapgray, vmin0, vmax255)plt.title(f$\gamma{gammaList[k]}$)plt.show()4. 图像的直方图处理 4.1 灰度直方图 图像直方图是反映图像像素分布的统计表横坐标代表像素值的取值区间纵坐标代表每一像素值在图像中的像素总数或者所占的百分比。 灰度直方图是图像灰度级的函数用来描述每个灰度级在图像矩阵中的像素个数。 灰度直方图反映了图像中的灰度分布规律直观地表现了图像中各灰度级的占比很好地体现出图像的亮度和对比度信息灰度图分布居中说明亮度正常偏左说明亮度较暗偏右表明亮度较高狭窄陡峭表明对比度降低宽泛平缓表明对比度较高。 根据直方图的形态可以判断图像的质量通过调控直方图的形态可以改善图像的质量。 OpenCV 提供了函数 cv2.calcHist 可以计算直方图Numpy 中的函数 np.bincount 也可以实现同样的功能。 函数说明 cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) → hist函数 cv2.calcHist 可以计算一维直方图或二维直方图函数的参数 images, channels, histSize, ranges 在计算一维直方图时也要带 [] 号。 参数说明 images输入图像用 [] 括号表示channels 直方图计算的通道用 [] 括号表示mask掩模图像一般置为 NonehistSize直方柱的数量一般取 256ranges像素值的取值范围一般为 [0,256]返回值 hist返回每一像素值在图像中的像素总数形状为 (histSize,1) 注意 参数 images, channels, histSize, ranges 都要带 [] 号。 mask 是与 images 大小相同的掩模图像掩模为 0 的区域不作处理。不使用掩模时设为 None。 3. channels 设置对彩色图像的指定通道计算直方图灰度图像时设为 0。 4. Numpy 中的函数 np.bincount 也可以实现同样的功能但该函数返回值的形状为 (histSize,) 例程1.57 图像的灰度直方图 # 1.57 图像的灰度直方图img cv2.imread(../images/imgLena.tif, flags0) # flags0 读取为灰度图像histCV cv2.calcHist([img], [0], None, [256], [0, 256]) # OpenCV 函数 cv2.calcHisthistNP, bins np.histogram(img.flatten(), 256)print(histCV.shape, histNP.shape) # histCV: (256, 1), histNP: (256,)plt.figure(figsize(10,3))plt.subplot(131), plt.imshow(img, cmapgray, vmin0, vmax255), plt.title(Original), plt.axis(off)plt.subplot(132,xticks[], yticks[]), plt.axis([0,255,0,np.max(histCV)])plt.bar(range(256), histCV[:,0]), plt.title(Gray Hist(cv2.calcHist))plt.subplot(133,xticks[], yticks[]), plt.axis([0,255,0,np.max(histCV)])plt.bar(bins[:-1], histNP), plt.title(Gray Hist(np.histogram))plt.show()4.2 直方图均衡化 直方图均衡化是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量通过调控直方图的形态可以改善图像的质量。 直方图均衡化是将原始图像通过函数变换调控图像的灰度分布得到直方图分布合理的新图像以此来调节图像亮度、增强动态范围偏小的图像的对比度。 由于人眼视觉特性直方图均匀分布的图像视觉效果较好。直方图均衡化的基本思想是对图像中占比大的灰度级进行展宽而对占比小的灰度级进行压缩使图像的直方图分布较为均匀扩大灰度值差别的动态范围从而增强图像整体的对比度。 因此直方图均衡化就是对图像进行非线性拉伸重新分配图像像素值本质上是根据直方图对图像进行线性或非线性灰度变换。 例如直方图均衡化可以把原始图像的直方图调整到均匀分布增加像素之间灰度值差别的动态范围从而增强图像整体的对比度。 通过累积分布函数cumulative distribution function, CDF可以实现将原图像 r 的分布转换成 s 的均匀分布累计分布函数CDF就是是概率密度函数probability density function, PDF的积分。 若 pr(r)p_r(r)pr​(r) 和 $p_s(s) $表示原图像 r 和新图像 s 的概率密度函数则 sT(r)(L−1)∫0rpr(r)drsT(r) (L-1) \int _0 ^r p_r(r) dr sT(r)(L−1)∫0r​pr​(r)dr 其离散形式为 skT(rk)(L−1)∑j0kpr(rj)(L−1)∑j0knjNs_k T(r_k) (L-1) \sum_{j0}^k p_r(r_j) (L-1) \sum_{j0}^k \frac{n_j}{N} sk​T(rk​)(L−1)j0∑k​pr​(rj​)(L−1)j0∑k​Nnj​​ 于是可以通过原图像的直方图直接求出均衡化后各像素的灰度级 sks_ksk​得到实现直方图均衡的转换函数 1计算原始灰度图像的直方图 2通过直方图累加计算原始图像的累计分布函数 CDF 3基于累计分布函数 CDF通过插值计算得到新的灰度值。 OpenCV 提供了函数 cv2. equalizeHist 可以实现直方图均衡化。 函数说明 cv2.qualizeHist(src[, dst]) → dst参数说明 src输入图像返回值 dst输出图像直方图均衡化 例程1.58 直方图均衡 # 1.58 直方图均衡img cv2.imread(../images/Fig0310b.tif, flags0) # flags0 读取为灰度图像imgEqu cv2.equalizeHist(img) # 使用 cv2.qualizeHist 完成直方图均衡化变换# histogram equalization image# histImg, bins np.histogram(img.flatten(), 256) # 计算原始图像直方图# cdf histImg.cumsum() # 计算累积分布函数 CDF# cdf cdf * 255 / cdf[-1] # 累计函数 CDF 归一化: [0,1]-[0,255]# imgEqu np.interp(img.flatten(), bins[:256], cdf) # 线性插值计算新的灰度值# imgEqu imgEqu.reshape(img.shape) # 将压平的图像数组重新变成二维数组fig plt.figure(figsize(7,7))plt.subplot(221), plt.title(Original image (youcans)), plt.axis(off)plt.imshow(img, cmapgray, vmin0, vmax255) # 原始图像plt.subplot(222),plt.title(Hist-equalized image), plt.axis(off)plt.imshow(imgEqu, cmapgray, vmin0, vmax255) # 转换图像histImg, bins np.histogram(img.flatten(), 256) # 计算原始图像直方图plt.subplot(223, yticks[]), plt.bar(bins[:-1], histImg) # 原始图像直方图plt.title(Histogram of original image), plt.axis([0,255,0,np.max(histImg)])histEqu, bins np.histogram(imgEqu.flatten(), 256) # 计算原始图像直方图plt.subplot(224, yticks[]), plt.bar(bins[:-1], histEqu) # 转换图像直方图plt.title(Histogram of equalized image), plt.axis([0,255,0,np.max(histImg)])plt.show()4.3 直方图匹配 直方图均衡直接对图像全局进行均衡化生成具有均匀直方图的图像并不考虑局部图像区域的具体情况。对于一幅图像的局部区域、具体缺陷有时需要生成具有特殊形状直方图的图像。 直方图匹配又称为直方图规定化是指将图像的直方图调整为规定的形状。 例如将一幅图像或某一区域的直方图匹配到另一幅影像上使两幅影像的色调保持一致。 这就需要在直方图均衡的基础上再进行一次反变换将均匀形状的直方图调整为规定的形状。 直方图匹配的主要步骤为 1通过规定图像 z 的直方图 pz(z)p_z(z)pz​(z)计算其直方图均衡变换的 sks_ksk​ 2通过 sks_ksk​ 计算图像 z 的直方图均衡变换函数 GGGG(zq)skG(z_q)s_kG(zq​)sk​ 3计算变换函数 GGG 的逆变换函数 G−1G^{-1}G−1zqG−1(sk)z_qG^{-1}(s_k)zq​G−1(sk​) 4对输入图像 r 进行直方图均衡得到均衡图像 s然后再用逆变换函数 G−1G^{-1}G−1 将其映射到 pz(z)p_z(z)pz​(z)得到直方图匹配图像 z。本步骤中的两次变换也可以合并为一次完成。 例程1.59 灰度图像直方图匹配 # 1.59 灰度图像直方图匹配img cv2.imread(../images/imgGaia.tif, flags0) # flags0 读取为灰度图像imgRef cv2.imread(../images/Fig0307a.tif, flags0) # 匹配模板图像, matching template# imgOut calcHistMatch(img, imgRef) # 子程序直方图匹配# 计算累计直方图histImg, bins np.histogram(img.flatten(), 256) # 计算原始图像直方图histRef, bins np.histogram(imgRef.flatten(), 256) # 计算匹配模板直方图cdfImg histImg.cumsum() # 计算原始图像累积分布函数 CDFcdfRef histRef.cumsum() # 计算匹配模板累积分布函数 CDF# 计算直方图匹配转换函数transM np.zeros(256)for i in range(256):index 0vMin np.fabs(cdfImg[i] - cdfRef[0])for j in range(256):diff np.fabs(cdfImg[i] - cdfRef[j])if (diff vMin):index int(j)vMin difftransM[i] index# 直方图匹配# imgOut np.zeros_like(img)imgOut transM[img].astype(np.uint8)fig plt.figure(figsize(10,7))plt.subplot(231), plt.title(Original image), plt.axis(off)plt.imshow(img, cmapgray) # 原始图像plt.subplot(232), plt.title(Matching template), plt.axis(off)plt.imshow(imgRef, cmapgray) # 匹配模板plt.subplot(233), plt.title(Matching output), plt.axis(off)plt.imshow(imgOut, cmapgray) # 匹配结果histImg, bins np.histogram(img.flatten(), 256) # 计算原始图像直方图plt.subplot(234, yticks[]), plt.bar(bins[:-1], histImg)histRef, bins np.histogram(imgRef.flatten(), 256) # 计算匹配模板直方图plt.subplot(235, yticks[]), plt.bar(bins[:-1], histRef)histOut, bins np.histogram(imgOut.flatten(), 256) # 计算匹配结果直方图plt.subplot(236, yticks[]), plt.bar(bins[:-1], histOut)plt.show()例程1.60 彩色图像直方图匹配 # 1.60 彩色图像的直方图匹配img cv2.imread(../images/imgGaia.tif, flags1) # flags1 读取为彩色图像imgRef cv2.imread(../images/imgLena.tif, flags1) # 匹配模板图像 (matching template)_, _, channel img.shapeimgOut np.zeros_like(img)for i in range(channel):print(i)histImg, _ np.histogram(img[:,:,i], 256) # 计算原始图像直方图histRef, _ np.histogram(imgRef[:,:,i], 256) # 计算匹配模板直方图cdfImg np.cumsum(histImg) # 计算原始图像累积分布函数 CDFcdfRef np.cumsum(histRef) # 计算匹配模板累积分布函数 CDFfor j in range(256):tmp abs(cdfImg[j] - cdfRef)tmp tmp.tolist()index tmp.index(min(tmp)) # find the smallest number in tmp, get the index of this numberimgOut[:,:,i][img[:,:,i]j] indexfig plt.figure(figsize(10,7))plt.subplot(231), plt.title(Original image), plt.axis(off)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 显示原始图像plt.subplot(232), plt.title(Matching template), plt.axis(off)plt.imshow(cv2.cvtColor(imgRef, cv2.COLOR_BGR2RGB)) # 显示匹配模板plt.subplot(233), plt.title(Matching output), plt.axis(off)plt.imshow(cv2.cvtColor(imgOut, cv2.COLOR_BGR2RGB)) # 显示匹配结果histImg, bins np.histogram(img.flatten(), 256) # 计算原始图像直方图plt.subplot(234, yticks[]), plt.bar(bins[:-1], histImg)histRef, bins np.histogram(imgRef.flatten(), 256) # 计算匹配模板直方图plt.subplot(235, yticks[]), plt.bar(bins[:-1], histRef)histOut, bins np.histogram(imgOut.flatten(), 256) # 计算匹配结果直方图plt.subplot(236, yticks[]), plt.bar(bins[:-1], histOut)plt.show()4.4 局部直方图处理 直方图均衡和直方图匹配都是基于整幅图像的灰度分布进行全局变换并非针对图像局部区域的细节进行增强。 直方图处理对于局部同样适用局部直方图处理的思想是基于像素邻域的灰度分布进行直方图变换处理。 局部直方图处理的过程是 1设定某一大小的模板矩形邻域在图像中沿逐个像素移动 2对每个像素位置计算模板区域的直方图对该局部区域进行直方图均衡或直方图匹配变换变换结果只用于模板区域中心像素点的灰度值修正 3模板邻域在图像中逐行逐列移动遍历所有像素点完成对整幅图像的局部直方图处理。 OpenCV 提供了类 cv2. createCLAHE 用于创建自适应均衡化的对象和方法可以实现局部直方图处理。 函数说明 cv2.createCLAHE([, clipLimit[, tileGridSize]]) → retval参数说明 clipLimit颜色对比度的阈值可选项默认值 8titleGridSize局部直方图均衡化的模板邻域大小可选项默认值 (8,8) cv2. createCLAHE 是一种限制对比度自适应直方图均衡化方法Contrast Limited Adaptive Hitogram Equalization采用了限制直方图分布的方法和加速的插值方法。 基本例程1.61 自适应的局部直方图均衡 # 1.61 局部直方图均衡化img cv2.imread(../images/FigClahe.jpg, flags0) # flags0 读取为灰度图像imgEqu cv2.equalizeHist(img) # 全局直方图均衡化clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(4,4)) # 创建 CLAHE 对象imgLocalEqu clahe.apply(img) # 自适应的局部直方图均衡化plt.figure(figsize(9, 6))plt.subplot(131), plt.title(Original), plt.axis(off)plt.imshow(img, cmapgray, vmin0, vmax255)plt.subplot(132), plt.title(fGlobal Equalize Hist), plt.axis(off)plt.imshow(imgEqu, cmapgray, vmin0, vmax255)plt.subplot(133), plt.title(fLocal Equalize Hist), plt.axis(off)plt.imshow(imgLocalEqu, cmapgray, vmin0, vmax255)plt.tight_layout()plt.show()4.5 直方图统计量图像增强 直方图统计量图像增强是基于直方图的统计量信息如均值和方差对图像的灰度和对比度进行调整。直方图统计量不仅用于图像的全局增强在图像局部增强中更加有效。 局部均值和方差是根据像素邻域特征进行灰度调整的基础。像素邻域的局部均值是平均灰度的测度局部方差是对比度的测度。使用局部均值和方差可以开发出简单而强大的图像局部增强算法。 以下基于 Rafael C. Gonzalez “Digital Image Processing (4th.Ed.)” 中的方法和案例进行介绍。 增强后的图像 g(x,y) 与原始图像 f(x,y) 的修正公式为 g(x,y){C∗f(x,y),(k0mGm(Sxy)k1mG)and(k2σGσ(Sxy)k3σG)f(x,y),Cmax(rGlobal)/max(rROI)g(x,y) \begin{cases} C*f(x,y) ,(k_0 m_G m(S_{xy}) k_1 m_G) and (k_2 \sigma_G \sigma(S_{xy}) k_3 \sigma_G)\\ f(x,y) , \end{cases}\\ C max(r_{Global})/max(r_{ROI}) g(x,y){C∗f(x,y),(k0​mG​m(Sxy​)k1​mG​)and(k2​σG​σ(Sxy​)k3​σG​)f(x,y),​Cmax(rGlobal​)/max(rROI​) 如果待增强区域相对平均灰度更暗可以选择 k00,k10.1k_0 0, k_1 0.1k0​0,k1​0.1如果待增强区域的对比度很低可以选择 k20,k30.1k_2 0, k_3 0.1k2​0,k3​0.1。 需要指出的是这种方法只对某些特殊类型的图像有效而且需要针对具体图像进行 ROI 设置和参数调节才能取得较好的图像增强效果。 基本例程1.63 直方图统计量图像增强 # # 1.63 直方图统计量图像增强img cv2.imread(../images/Fig0326a.tif, flags0) # flags0 读取为灰度图像imgROI img[12:120, 12:120]maxImg, maxROI img.max(), imgROI.max()const maxImg / maxROIimgHSE enhanceHistStat(img, const) # 子程序直方图统计量增强 (自定义方法)plt.figure(figsize(10, 6))plt.subplot(131), plt.title(Original image), plt.axis(off)plt.imshow(img, cmapgray, vmin0, vmax255)plt.subplot(132), plt.title(Global equalize histogram), plt.axis(off)imgEqu cv2.equalizeHist(img) # 使用 cv2.qualizeHist 完成直方图均衡化变换plt.imshow(imgEqu, cmapgray, vmin0, vmax255)plt.subplot(133), plt.title(Histogram statistic enhance), plt.axis(off)plt.imshow(imgHSE, cmapgray, vmin0, vmax255)plt.show()4.6 直方图反向投影反向追踪 直方图反向投影是一种在输入图像中查找与特定模板图像匹配最佳的点或区域的方法可以对特定颜色物体、特定灰度物体进行查找、跟踪常用于图像查找、图像分割。 直方图反向投影处理的原理是计算某一特征的直方图模型再使用该模型去寻找图像中存在的特征。 直方图反向投影处理的过程首先建立模板区域的直方图再将直方图投影到输入图像计算输入图像中每个像素点的像素值与直方图匹配概率得到概率图像并以一定阈值进行二值化处理。 OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向投影。 函数说明 cv2.calcBackProject(images, channels, hist, ranges, scale[, dst]) → dst参数说明 images颜色对比度的阈值可选项默认值 8 channels 计算反向投影的图像通道 hist 查找模板区域的直方图 ranges每个维度中直方图单元边界的数组 scale反向投影输出的缩放比例 返回值 dst返回反向投影的输出图像 基本例程1.64 直方图反向投影追踪 # 1.64 直方图反向投影roi cv2.imread(../images/BallFrag.png, flags1) # 查找的图像区域target cv2.imread(../images/imgBall.png, flags1) # 被查找的目标图像hsvRoi cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)hsvTar cv2.cvtColor(target, cv2.COLOR_BGR2HSV)histRoi cv2.calcHist([hsvRoi], [0, 1], None, [180, 256], [0, 180, 0, 256]) # 计算目标直方图cv2.normalize(histRoi, histRoi, 0, 255, cv2.NORM_MINMAX) # 归一化 -[0,255]dst cv2.calcBackProject([hsvTar], [0, 1], histRoi, [0, 180, 0, 256], 1) # 反向投影disc cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 定义椭圆结构形状imgConv cv2.filter2D(dst, -1, disc) # 图像卷积ret, thresh cv2.threshold(imgConv, 100, 255, 0) # 图像二值化处理得到掩模模板imgTrack cv2.bitwise_and(target, target, maskthresh) # 以 thresh 为掩模按位与显示查找区域plt.figure(figsize(10,6))plt.subplot(131), plt.imshow(cv2.cvtColor(target, cv2.COLOR_BGR2RGB)), plt.title(target image), plt.axis(off)plt.subplot(132), plt.imshow(thresh, gray), plt.title(tracking mask), plt.axis(off)plt.subplot(133), plt.imshow(cv2.cvtColor(imgTrack, cv2.COLOR_BGR2RGB)), plt.title(tracking result), plt.axis(off)plt.show()版权声明 youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/120995650) Copyright 2022 youcans, XUPT 专栏地址『youcans 的图像处理学习课』 文章目录『youcans 的图像处理学习课 - 总目录』
http://www.pierceye.com/news/898041/

相关文章:

  • 湘潭做网站 i磐石网络博学网站建设公司
  • 揭阳市建设发展总公司网站自己做的视频网站如何赚钱
  • 泉州自助建站软件天眼查在线查询官网
  • 网站建设书模板校本教研网站建设方案
  • 经销商自己做网站合适吗彩虹网站建设
  • 网站新闻编辑怎么做网站开发人员 组织架构
  • 重庆网站seo诊断婚纱摄影网站模板下载
  • 老板合作网站开发宁波网站建设慕枫科技
  • 做外贸都有哪些好网站河北沙河市规划局或建设局网站
  • 网站设计建设维护专门做网站的app
  • 哈尔滨建站模板大全慈溪高端网站设计
  • 升阳广州做网站公司门户网站建设存在的问题和差距
  • 杭州建设行业网站做兼职网站
  • 连云港市城乡建设管理局网站wordpress怎么设置
  • 如何找做网站的公司网站建站哪家公司好
  • 网站建设性价比高珠海网站建设工程
  • 设计公司网站需要什么条件网站建设与管理课程代码
  • 局域网网站怎么做软件定制开发的发展前景
  • 门户网站关键词旅游网站开发报价单
  • 哪个网站做视频收益高社区服务呼叫系统 网站的建设
  • 网站是如何制作的工厂 电商网站建设
  • 展览设计网站有哪些南海网站智能推广
  • 贵阳做网站需要多少钱凡科网站建设完成下载下载器
  • 虚拟机上做钓鱼网站照片网站怎么做
  • 建网页和建网站编程猫少儿编程app下载
  • 网站首页介绍cms系统架构
  • 建设厅的工程造价网站东莞网站优化方式
  • 微信网站模板源码wordpress如何编辑
  • 做网站p图工具公司网站建设教程
  • 网站 选项卡 图标苏州网站网页设计