彩色图像处理 彩色空间转换及代码实现

news/2024/11/20 15:40:03/

一、彩色图像基础

为什么要研究彩色图像处理?

  • 符合人类视觉特点:人类可以辨别几千种颜色色调和亮度;只能辨别几十种灰度层次。
  • 有用的描绘子:简化目标物的区分;目标识别,根据目标的颜色特征。

彩色图像处理可分为:

  • 全彩色处理:数码相机,数码摄像机,彩色扫描仪。
  • 伪彩色处理:对不同的灰度或灰度范围赋予不同的颜色。

当一束白光通过一个玻璃棱镜时,出现的光束 不是白光,而是由一端为紫色到另一端为红色的 连续彩色谱组成。
 

光特性是颜色科学的核心。

描述彩色光的3个基本量

  • 辐射率:从光源流出能量的总量,用瓦特(W) 度量
  • 光强:观察者从光源接收的能量总和
  • 亮度:主观描绘子

三原色 :红色(Red)、绿色(Green)、蓝色(Blue)

二、彩色空间(也称彩色模型或彩色系统)

色彩模式 

RGB

  • CCD技术直接感知R,G,B三个分量
  • 是图像成像、显示、打印等设备的基础

CMY(青、深红、黄)、CMYK (青、深红、 黄、黑)

运用在大多数在纸上沉积彩色颜料的设备, 如彩色打印机和复印机。

CMYK

  • 打印中的主要颜色是黑色
  • 等量的CMY原色产生黑色,但不纯
  • 在CMY基础上,加入黑色,形成CMYK彩色 空间

HSI(色调、饱和度、亮度)

两个特点:

  • 分量与图像的彩色信息无关
  • H和S分量与人感受颜色的方式是紧密相连的

将亮度(I)与色调(H)和饱和度(S)分开;
避免颜色受到光照明暗(I)等条件的干扰;
仅仅分析反映色彩本质的色调和饱和度;
广泛用于计算机视觉、图像检索和视频检索。

YIQ

  • Y指亮度(Brightness),即灰度值
  • I和Q指色调,描述色彩及饱和度
  • 用于彩色电视广播,被北美的电视系统 所采用(属于NTSC系统)
  • Y分量可提供黑白电视机的所有影像信息

YUV

  • Y指亮度,与YIQ的Y相同
  • U和V也指色调,不同于YIQ的I和Q
  • 用于彩色电视广播,被欧洲的电视系统所采用(属于PAL系统)
  • Y分量也可提供黑白电视机的所有影像信息

YCbCr 

  • Y指亮度,与YIQ和YUV的Y相同
  •  Cb和Cr由U和V调整得到
  • JPEG采用的彩色空间
     

彩色空间转换

 

 

 

伪彩色图像处理

伪彩色图像处理,也叫假彩色图像处理,根据一定的准则对灰度值赋以彩色的处理。

区分:伪彩色图像、真彩色图像、单色图像

为什么需要伪彩色图像处理?人类可以辨别上千种颜色和强度,但只能辨别二十几种灰度。

应用:为人们观察和解释图像中的灰度目标。

怎样进行伪彩色图像处理? 强度分层技术;灰度级到彩色转换技术。
 

强度分层技术

把一幅图像描述为三维函数(x,y,f(x,y))

分层技术:放置平行于(x,y)坐标面的平面

每一个平面在相交区域切割图像函数

令[0,L-1]表示灰度级,使l0代表黑色(f(x,y)=0), lL-1代表白色(f(x,y)=L-1)。假设垂直于强度轴的P 个平面定义为量级l1,l2,…,lP。0<P<L-1,P个平面 将灰度级分为P+1个间隔,V1,V2,…,VP+1,则灰度级 到彩色的赋值关系:

         

 c_k是与强度间隔 V_k第k级强度有关的颜色,Vk  是由在l=k-1和l=k分割平面定义的。
 

灰度级到彩色的转换

  • 对任何输入像素的灰度级执行3个独立变换
  • 3个变换结果分别送入彩色监视器的红、绿、 蓝三个通道
  •  产生一幅合成图像

全彩色图像处理基础

全彩色图像处理研究分为两大类:

  • 分别处理每一分量图像,然后,合成彩色图像
  • 直接对彩色像素处理:3个颜色分量表示像素 向量。令c代表RGB彩色空间中的任意向量

 对大小为 M * N 的图像

彩色变换

彩色变换函数

 

补色

补色:在如图所示的彩色环上,与一种色调直接 相对立的另一种色调称为补色。

作用:增强嵌在彩色图像暗区的细节。

彩色图像平滑

令Sxy表示在RGB彩色图像中定义一个中心在(x,y) 的邻域的坐标集,在该邻域中RGB分量的平均值为

彩色图像尖锐化(拉普拉斯微分)

RGB彩色空间,分别计算每一分量图像的拉普拉斯变换

彩色分割(把一幅图像分成区域)

HSI彩色空间分割——直观

  • H色调图像方便描述彩色
  • S饱和度图像做模板分离感兴趣的特征区
  • 强度图像不携带彩色信息

RGB彩色空间——直接

RGB彩色空间分割

令z代表RGB空间中的任意一点,a是分割 颜色样本集的平均颜色向量

 

三、python实现5种彩色空间的转换

具体而言,包括:

1)RGB → CMY;
2)  CMY → RGB;
3)  RGB → HSI;
4)  HSI → RGB;
5)  RGB → YIQ;
6)  YIQ → RGB;
7)  RGB → YUV;
8)  YUV → RGB;
9)  RGB → YCbCr;
10) YCbCr → RGB;
 

1 RGB → CMY

转换公式

 代码

'''-----------------RGB → CMY------------------------'''
import cv2
import imutilsdef rgb_cmy(img):r, g, b = cv2.split(img)  # split the channels# normalization [0,1]r = r / 255.0g = g / 255.0b = b / 255.0c = 1 - rm = 1 - gy = 1 - bresult = cv2.merge((c, m, y))  # merge the channelsreturn resultif __name__ == '__main__':img = cv2.imread("E:/1.PNG")img_CMY = rgb_cmy(img)img_NEW = img_CMY * 255cv2.imwrite('F:/img_CMY.PNG', img_NEW)cv2.imshow("CMY image", imutils.resize(img_CMY, 666))cv2.imshow("original image", imutils.resize(img, 666))cv2.waitKey(0)cv2.destroyAllWindows()

效果

2 CMY → RGB

公式

 代码

'''-----------------CMY → RGB------------------------'''
import cv2
import imutilsdef cmy_rgb(img):c, m, y = cv2.split(img)  # split the channels# normalization[0,1]c = c / 255.0m = m / 255.0y = y / 255.0r = 1 - cg = 1 - mb = 1 - yresult = cv2.merge((r, g, b))  # merge the channelsprint(result)return resultif __name__ == '__main__':img = cv2.imread("F:/img_CMY.PNG")img_CMY = cmy_rgb(img)cv2.imshow("RGB image", imutils.resize(img_CMY, 666))cv2.imshow("original image", imutils.resize(img, 666))cv2.waitKey(0)cv2.destroyAllWindows()

效果

3 RGB → HSI

公式

 代码

'''-----------------RGB → HSI------------------------'''
import cv2
import math
import imutils
import numpy as npdef rgb_hsi(rgb_Img):img_rows = int(rgb_Img.shape[0])img_cols = int(rgb_Img.shape[1])b, g, r = cv2.split(rgb_Img)# normalization[0,1]r = r / 255.0g = g / 255.0b = b / 255.0hsi_Img = rgb_Img.copy()H, S, I = cv2.split(hsi_Img)for i in range(img_rows):for j in range(img_cols):num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))theta = float(np.arccos(num/den))if den == 0:H = 0elif b[i, j] <= g[i, j]:H = thetaelse:H = math.pi - thetamin_RGB = min(min(b[i, j], g[i, j]), r[i, j])sum = b[i, j]+g[i, j]+r[i, j]if sum == 0:S = 0else:S = 1 - 3*min_RGB/sumH = H/(math.pi)I = sum/3.0# 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间hsi_Img[i, j, 0] = H*255hsi_Img[i, j, 1] = S*255hsi_Img[i, j, 2] = I*255return hsi_Imgif __name__ == '__main__':rgb_Img = cv2.imread("E:/1.PNG")hsi_Img = rgb_hsi(rgb_Img)cv2.imwrite('F:/img_HSI.PNG', hsi_Img)cv2.imshow('original image', imutils.resize(rgb_Img, 600))cv2.imshow('HSI image', imutils.resize(hsi_Img, 600))key = cv2.waitKey(0) & 0xFFif key == ord('q'):cv2.destroyAllWindows()

效果 

4 HSI → RGB

公式

 代码

'''-----------------HSI → RGB------------------------'''
import cv2
import math
import imutilsdef hsi_rgb(hsi_img):img_rows = int(hsi_img.shape[0])img_cols = int(hsi_img.shape[1])H, S, I = cv2.split(hsi_img)# normalization[0,1]H = H / 255.0S = S / 255.0I = I / 255.0bgr_img = hsi_img.copy()B, G, R = cv2.split(bgr_img)for i in range(img_rows):for j in range(img_cols):if S[i, j] < 1e-6:R = I[i, j]G = I[i, j]B = I[i, j]else:H[i, j] *= 360if H[i, j] > 0 and H[i, j] <= 120:B = I[i, j] * (1 - S[i, j])R = I[i, j] * (1 + (S[i, j] * math.cos(H[i, j] * math.pi / 180)) / math.cos((60 - H[i, j]) * math.pi / 180))G = 3 * I[i, j] - (R + B)elif H[i, j] > 120 and H[i, j] <= 240:H[i, j] = H[i, j] - 120R = I[i, j] * (1 - S[i, j])G = I[i, j] * (1 + (S[i, j] * math.cos(H[i, j] * math.pi / 180)) / math.cos((60 - H[i, j]) * math.pi / 180))B = 3 * I[i, j] - (R + G)elif H[i, j] > 240 and H[i, j] <= 360:H[i, j] = H[i, j] - 240G = I[i, j] * (1 - S[i, j])B = I[i, j] * (1 + (S[i, j] * math.cos(H[i, j] * math.pi / 180)) / math.cos((60 - H[i, j]) * math.pi / 180))R = 3 * I[i, j] - (G + B)bgr_img[i, j, 0] = B * 255bgr_img[i, j, 1] = G * 255bgr_img[i, j, 2] = R * 255return bgr_imgif __name__ == '__main__':hsi_Img = cv2.imread("F:/img_HSI.PNG")rgb_Img = hsi_rgb(hsi_Img)cv2.imshow('original image', imutils.resize(rgb_Img, 600))cv2.imshow('RGB image', imutils.resize(hsi_Img, 600))key = cv2.waitKey(0) & 0xFFif key == ord('q'):cv2.destroyAllWindows()

效果

5 RGB → YIQ

公式

 python代码

'''-----------------RGB → YIQ------------------------'''
import cv2
import imutils
import numpy as npdef rgb_yiq(rgb_Img):img_rows = int(rgb_Img.shape[0])img_cols = int(rgb_Img.shape[1])yiq_image = rgb_Img.copy()R, G, B = cv2.split(yiq_image)for x in range(img_rows):for y in range(img_cols):right_matrix = np.array([[R[x,y]],[G[x,y]],[B[x,y]]])left_matrix = np.array([[0.299,0.587,0.114],[0.596,-0.275,-0.321],[0.212,-0.528,0.311]])matrix = np.dot(left_matrix,right_matrix)r = matrix[0][0]g = matrix[1][0]b = matrix[2][0]yiq_image[x, y] = (r, g, b)return yiq_imageif __name__ == '__main__':rgb_Img = cv2.imread("E:/1.PNG")yiq_Img = rgb_yiq(rgb_Img)cv2.imshow('original image', imutils.resize(rgb_Img, 600))cv2.imshow('YIQ image', imutils.resize(yiq_Img, 600))cv2.imwrite('F:/img_YIQ1.PNG', yiq_Img)key = cv2.waitKey(0) & 0xFFif key == ord('q'):cv2.destroyAllWindows()

matlab代码

% 清变量,关闭窗口
clear;
close all;
% 文件读取
img=imread('E:/1.PNG'); %获得256*256*3数组
imshow(img);title('原始RGB图像');rgb=im2double(img); %将原图像转换到[0,1]空间
% figure;     %与原图像相同
% imshow(rgb);
r=rgb(:,:,1);
g=rgb(:,:,2);
b=rgb(:,:,3)% rgb模型到yiq模型
y=0.299*r+0.587*g+0.114*b;
i=0.596*r-0.274*g-0.322*b;
q=0.211*r-0.523*g+0.312*b;
img_YIQ=cat(3,y,i,q);
figure;
imshow(img_YIQ);title('RGB2YIQ图像');

效果

6 YIQ → RGB

公式

python代码

'''-----------------YIQ → RGB------------------------'''
import cv2
import imutils
import numpy as npdef yiq_rgb(yiq_Img):img_rows = int(yiq_Img.shape[0])img_cols = int(yiq_Img.shape[1])rgb_image = yiq_Img.copy()Y, I, Q = cv2.split(rgb_image)for x in range(img_rows):for y in range(img_cols):right_matrix = np.array([[Y[x,y]],[I[x,y]],[Q[x,y]]])left_matrix = np.array([[1,0.956,0.620],[1,-0.272,-0.647],[1,-1.108,1.705]])matrix = np.dot(left_matrix,right_matrix)r = matrix[0][0]g = matrix[1][0]b = matrix[2][0]rgb_image[x, y] = (r, g, b)return rgb_imageif __name__ == '__main__':yiq_Img = cv2.imread("F:/img_YIQ1.PNG")rgb_Img = yiq_rgb(yiq_Img)cv2.imshow('original image', imutils.resize(yiq_Img, 600))cv2.imshow('RGB image', imutils.resize(rgb_Img, 600))key = cv2.waitKey(0) & 0xFFif key == ord('q'):cv2.destroyAllWindows()

matlab代码

% 清变量,关闭窗口
clear;
close all;
% 文件读取
img=imread('F:\img_YIQ.PNG'); %获得256*256*3数组
imshow(img);title('原始YIQ图像');yiq=im2double(img); %将原图像转换到[0,1]空间
% figure;     %与原图像相同
% imshow(rgb);
y=yiq(:,:,1);
i=yiq(:,:,2);
q=yiq(:,:,3)% rgb模型到yiq模型
r=1*y+0.956*i+0.620*q;
g=1*y-0.272*i-0.674*q;
b=1*y-1.108*i+1.705*q;img_YIQ=cat(3,r,g,b);
figure;
imshow(img_YIQ);title('YIQ2RGB图像');

效果

7 RGB → YUV

公式

代码

'''-----------------RGB → YUV------------------------'''
import numpy as np
import cv2 as cv
import imutilsdef rgb_yuv(rgb_img):W = np.array([[0.299, 0.587, 0.114],[-0.148, -0.289, 0.437],[0.615, -0.515, -0.100]])rgb_Img = rgb_img.copy()rgb_Img = rgb_Img.astype(np.float)h, w, c = rgb_Img.shapefor i in range(h):for j in range(w):rgb_Img[i, j] = np.dot(W, rgb_Img[i, j])imc = rgb_Img.astype(np.uint8)return imcif __name__ == '__main__':img_rgb = cv.imread('E:/1.PNG')img_yuv1 = cv.cvtColor(img_rgb, cv.COLOR_RGB2YUV)img_yuv2 = rgb_yuv(img_rgb)cv.imwrite('F:/img_YUV.PNG', img_yuv1)# cv.imwrite('F:/img_YUV_self.PNG', img_yuv2)cv.imshow('original image', imutils.resize(img_rgb, 600))cv.imshow('OpenCV_YUV image', imutils.resize(img_yuv1, 600))cv.imshow('Self_YUV image', imutils.resize(img_yuv2, 600))cv.waitKey(0)

效果

8 YUV → RGB

公式

 代码

'''-----------------YUV → RGB------------------------'''
import numpy as np
import cv2 as cv
import imutilsdef yuv_rgb(yuv_img):W = np.array([[1, 0., 1.13983],[1, -0.39465, -0.58060],[1, 2.03211, 0.]])rgb_img = yuv_img.copy()rgb_img = yuv_img.astype(np.float)h, w, c = rgb_img.shapefor i in range(h):for j in range(w):rgb_img[i, j][0] -= 16  # Yrgb_img[i, j][1] -= 128  # Urgb_img[i, j][2] -= 128  # Vrgb_img[i, j] = np.matmul(W, rgb_img[i, j])imc = rgb_img.astype(np.uint8)return imcif __name__ == '__main__':img_rgb = cv.imread('F:/img_YUV.PNG')img_yuv1 = yuv_rgb(img_rgb)img_yuv2 = cv.cvtColor(img_rgb, cv.COLOR_YUV2RGB)cv.imshow('original image', imutils.resize(img_rgb, 600))cv.imshow('OpenCV_RGB image', imutils.resize(img_yuv2, 600))cv.imshow('Self_RGB image', imutils.resize(img_yuv1, 600))cv.waitKey(0)

效果

9 RGB → YCbCr

公式 

代码

'''-----------------RGB → YCbCr------------------------'''
import numpy as np
import cv2 as cv
import imutilsdef rgb2ycbcr(rgb_image):"""convert rgb into ycbcr"""if len(rgb_image.shape)!=3 or rgb_image.shape[2]!=3:raise ValueError("input image is not a rgb image")rgb_image = rgb_image.astype(np.float32)# 1:创建变换矩阵,和偏移量transform_matrix = np.array([[0.257, 0.564, 0.098],[-0.148, -0.291, 0.439],[0.439, -0.368, -0.071]])shift_matrix = np.array([16, 128, 128])ycbcr_image = np.zeros(shape=rgb_image.shape)w, h, _ = rgb_image.shape# 2:遍历每个像素点的三个通道进行变换for i in range(w):for j in range(h):ycbcr_image[i, j, :] = np.dot(transform_matrix, rgb_image[i, j, :]) + shift_matrixreturn ycbcr_imageif __name__ == '__main__':img_rgb = cv.imread('E:/1.PNG')img_ycbcr = rgb2ycbcr(img_rgb)img_NEW = img_ycbcr / 255cv.imwrite('F:/img_YCbCr.PNG', img_ycbcr)cv.imshow('original image', imutils.resize(img_rgb, 600))cv.imshow('Self_YCbCr image', imutils.resize(img_NEW, 600))cv.waitKey(0)

效果 

10 YCbCr → RGB

公式

 代码

'''-----------------YCbCr → RGB------------------------'''
import numpy as np
import cv2 as cv
import imutilsdef ycbcr2rgb(ycbcr_image):"""convert ycbcr into rgb"""if len(ycbcr_image.shape)!=3 or ycbcr_image.shape[2]!=3:raise ValueError("input image is not a rgb image")ycbcr_image = ycbcr_image.astype(np.float32)transform_matrix = np.array([[0.257, 0.564, 0.098],[-0.148, -0.291, 0.439],[0.439, -0.368, -0.071]])transform_matrix_inv = np.linalg.inv(transform_matrix)shift_matrix = np.array([16, 128, 128])rgb_image = np.zeros(shape=ycbcr_image.shape)w, h, _ = ycbcr_image.shapefor i in range(w):for j in range(h):rgb_image[i, j, :] = np.dot(transform_matrix_inv, ycbcr_image[i, j, :]) - np.dot(transform_matrix_inv, shift_matrix)return rgb_image.astype(np.uint8)if __name__ == '__main__':img_ycbcr = cv.imread('F:/img_YCbCr.PNG')img_rgb = ycbcr2rgb(img_ycbcr)img_NEW = img_rgb / 255cv.imshow('original image', imutils.resize(img_ycbcr, 600))cv.imshow('Self_RGB image', imutils.resize(img_NEW, 600))cv.waitKey(0)

效果

11 扩展1——多图处理

代码

'''-----------------RGB → CMY------------------------'''
import cv2
import imutilsdef rgb_cmy(img):r, g, b = cv2.split(img)  # split the channels# normalization [0,1]r = r / 255.0g = g / 255.0b = b / 255.0c = 1 - rm = 1 - gy = 1 - bresult = cv2.merge((c, m, y))  # merge the channelsreturn resultif __name__ == '__main__':for i in range(3):img = cv2.imread("F:/{}.PNG".format(i))img_CMY = rgb_cmy(img)img_NEW = img_CMY * 255cv2.imwrite('F:/img_CMY.PNG', img_NEW)cv2.imshow("CMY image{}".format(i), imutils.resize(img_CMY, 666))cv2.imshow("original image{}".format(i), imutils.resize(img, 666))cv2.waitKey(0)cv2.destroyAllWindows()

效果

12 扩展2——视频处理

爬取视频

import requests
import json
import redef change_title(title):# 替换非法字符pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]")new_title = re.sub(pattern, "_", title)return new_title# 示例爬取3页数据
for page in range(1, 4):print('---------------正在爬取第{}页小姐姐视频-------------------'.format(page))# 获取 URL 地址url = 'https://v.6.cn/minivideo/getlist.php?act=recommend&page={}&pagesize=20'.format(page)# headers 参数确定headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}# 模拟浏览器发送 URL 地址请求response = requests.get(url, headers=headers)# 去除 response 响应对象中的文本数据response_data = response.text# print(response_data)# 转换数据类型dict_data = json.loads(response_data)    # 字典# print(dict_data)# 数据解析data_list = dict_data['content']['list']   # 列表# print(data_list)# 遍历for data in data_list:# print(data)video_title = data['title']      # 视频文件名video_alias = data['alias']       # 视频作者名video_playurl = data['playurl']   # 视频 url# print('视频:', video_title, '作者:', video_alias, 'url地址:', video_playurl)print('正在下载视频:', video_title)new_title = change_title(video_title)# 发送视频 URL 请求video = requests.get(video_playurl, headers=headers).content# 保存数据with open(r'F:\Beautiful Girl Video\\' + new_title + '_' + video_alias + '.mp4', 'wb') as video_file:video_file.write(video)print('视频下载成功…… \n')print('---------------第{}页小姐姐视频爬取完毕-------------------'.format(page))

颜色模式转换

'''-----------------RGB → CMY------------------------'''
import cv2def rgb_cmy(video):while True:ret, frame=video.read()if not ret:breakelse:r, g, b = cv2.split(frame)  # split the channels# normalization [0,1]r = r / 255.0g = g / 255.0b = b / 255.0c = 1 - rm = 1 - gy = 1 - bresult = cv2.merge((c, m, y))  # merge the channelscv2.imshow('original video',frame)cv2.imshow('CMY video',result)cv2.waitKey(ret)if __name__ == '__main__':img = cv2.VideoCapture(r"F:\Beautiful Girl Video\video.mp4")img_CMY = rgb_cmy(img)

效果

参考博客

数字图像处理学习笔记(十六)——彩色图像处理_闭关修炼——暂退的博客-CSDN博客_强度分层技术

Python实现数字图像处理之5种彩色空间转换(单图+多图+视频)_闭关修炼——暂退的博客-CSDN博客

版权声明:本文为CSDN博主「闭关修炼——暂退」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IT_charge/article/details/106469458 


http://www.ppmy.cn/news/650960.html

相关文章

编译时间和运行态时间交换的优缺点

前言 &#xff08;1&#xff09;前几天&#xff0c;我刷视频无意之间看到一个视频说&#xff0c;sizeof(a)&#xff0c;这个a是会自增吗&#xff1f; &#xff08;2&#xff09;如果有经验的人肯定会说&#xff0c;不会自增&#xff0c;这是常识。那么将这句话转化为汇编之后会…

【vscode设置默认浏览器为google,配置默认浏览器没有google,VS Code 报Windows找不到文件‘chrome‘】

问题描述 VS Code 报Windows 找不到‘chrome’ 项目启动ctar鼠标左键快捷打开并没有使用默认浏览器 并且自己去浏览器配置并提供完整的选项 解决方案&#xff1a; 网上有很多其他的答案不过对我都没有 最后解决是在google里配置 不是默认浏览器会有个按钮 点一下就跳转到系统…

git常用命令之tag

11. Tag 11.1 创建tag 命令作用轻量标签git tag v1.0基于本地当前分支最新commit创建tag v1.0git tag v.0325 125a1d1给指定commit 125a1d打标签附注标签git tag -a v.0329 -m "给标签添加说明" 125a1d1基于指定commit创建标签并添加说明git tag -a v.0329 -m &quo…

Flink流批一体计算(9):Flink Python

目录 使用Python依赖 使用自定义的Python虚拟环境 方式一&#xff1a;在集群中的某个节点创建Python虚拟环境 方式二&#xff1a;在本地开发机创建Python虚拟环境 使用JAR包 使用数据文件 使用Python依赖 通过以下场景为您介绍如何使用Python依赖&#xff1a; 使用自定义…

镜头、相机、光源的选型

普通镜头需要掌握的基本概念&#xff1a; &#xff08;1&#xff09;焦距 &#xff1a;镜头主点到焦点距离 &#xff08;2&#xff09;光圈&#xff1a;控制通光量的大小 &#xff08;3&#xff09;光圈数&#xff1a;Ff/D&#xff0c;是焦距与CCD对角线长度的比值&#xff0c…

深入理解Java虚拟机jvm-对象如何进入老年代

HotSpot虚拟机中多数收集器都采用了分代收集来管理堆内存&#xff0c;那内存回收时就必须能决策哪些存 活对象应当放在新生代&#xff0c;哪些存活对象放在老年代中。 为做到这点&#xff0c;虚拟机给每个对象定义了一个对象年龄&#xff08;Age&#xff09;计数器&#xff0c…

【SpringMVC 学习笔记】

SpringMVC 笔记记录 1. SpringMVC 简介2. 入门案例3. 基本配置3.1 xml形式配置3.2 注解形式配置 4. 请求4.1 请求参数4.1.1 普通类型传参4.1.2 实体类类型传参4.1.3 数组和集合类型传参 4.2 类型转换器4.3 请求映射 5. 响应 1. SpringMVC 简介 三层架构 2. 入门案例 3. 基本…

基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;二&#xff09;&#xff1a;基础知识和解封装&#xff08;demux&#xff09;基于 FFmpeg 的跨平台视频…