第6章 Python 數字圖像處理(DIP) - 彩色圖像處理1 - RGB彩色模型,RGB to Gray,CMK和CMYK彩色模型,HSI彩色模型

第6章主要講的是彩色圖像處理,一些彩色模型如RGB,CMK,CMYK,HSI等色彩模型;彩色模型的變換關系;還包含由灰度圖像怎樣處理成假彩色圖像;使用彩色分割圖像等。本章比較少理論還有變換的描述,主要以代碼為主,如有需要,請自行查看書本。

這里寫目錄標題

  • 色彩基礎
    • 彩色模型
      • RGB彩色模型
      • RGB to Gray
      • CMK和CMYK 彩色模型
      • HSI

import numpy as np
import cv2
import matplotlib 
import matplotlib.pyplot as plt
import PILprint(f"Numpy version: {np.__version__}")
print(f"Opencv version: {cv2.__version__}")
print(f"Matplotlib version: {matplotlib.__version__}")
print(f"Pillow version: {PIL.__version__}")
Numpy version: 1.18.1
Opencv version: 4.2.0
Matplotlib version: 3.1.3
Pillow version: 7.0.0
def normalize(mask):return (mask - mask.min()) / (mask.max() - mask.min())

色彩基礎

區別不同顏色的特性通常是亮度、色調和飽和度。亮度體現的發光強度的消色概念;色調是混合光波中與主波長書的人屬性,表示被觀察者感知的主導色;飽和度是指相對的純度,或與一種色調混合的白光量。

色調與飽和度一起稱為色度,因此一種顏色可由其亮度和色度來表征。形成任何一種特殊顏色的紅色量、綠色量和藍色量稱為三色值,并分別表示為X,Y和Z。因此一種彩色就可由其三色系數來規定。

x=XX+Y+Z(6.1)x = \frac{X}{X + Y + Z} \tag{6.1}x=X+Y+ZX?(6.1)
y=YX+Y+Z(6.2)y = \frac{Y}{X + Y + Z} \tag{6.2}y=X+Y+ZY?(6.2)
z=ZX+Y+Z(6.3)z = \frac{Z}{X + Y + Z} \tag{6.3}z=X+Y+ZZ?(6.3)
x+y+z=1(6.4)x + y + z = 1 \tag{6.4}x+y+z=1(6.4)

彩色模型

彩色模型(也稱彩色空間或彩色系統)的目的是以某種師傅微軟方式來方便地規定顏色。彩色模型本質上規定:坐標系;坐標系內的子空間,模型內的每種顏色都可由子空間內包含的一個點來表示。

針對彩色顯示器和彩色攝像機開發的RGB(Red, Green, Blue)模型;針對彩色打印開發的CMY(Cyan, Magenta, Yellow)模型和CMYK(K is Black);針對人們描述和解釋顏色的方式開發的HSI(Hue, Saturation, Intensity)模型。

HSI能名解除圖像中顏色和灰度級信息的聯系,使其更適合灰度級處理技術。

RGB彩色模型

根根笛卡兒坐標系建立的。R,G和B的值都已經歸一化在區間[0, 1]內。RGB原色可解釋為發源于立方體原點的一個向量。

表示每個像素所用的比特數稱為像素深度

RGB三個通道,每個通道像素深度為8比特圖像,RGB彩色像素的深度為24比特。值域為[0, 255]

# RGB 彩色模型
img_bgr = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0608(RGB-full-color-cube).tif')
img_rgb = img_bgr[:, :, ::-1]
plt.figure(figsize=(5, 5))
plt.imshow(img_rgb), plt.xticks([]), plt.yticks([])
plt.show()

在這里插入圖片描述

# RGB 三個隱藏面,合成顯示RGB,R = 127
temp = np.zeros([512, 512], np.uint8)x = np.linspace(0, 1, temp.shape[0])
X = np.uint8(normalize(x) * 255)
X = np.tile(X, [512, 1])y = np.linspace(0, 1, temp.shape[0])
Y = np.uint8(normalize(y) * 255)
Y = np.tile(Y, [512, 1])R = temp + 127
G = X
B = np.rot90(Y)plt.figure(figsize=(20, 5))
plt.gray()
plt.subplot(143), plt.imshow(R, vmin=0, vmax=255), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(G, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(141), plt.imshow(B, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])img = np.dstack([R, G, B])
plt.subplot(144),plt.imshow(img), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# RGB 三個隱藏面,R = 0
temp = np.zeros([512, 512], np.uint8)x = np.linspace(0, 1, temp.shape[0])
X = np.uint8(normalize(x) * 255)
X = np.tile(X, [512, 1])y = np.linspace(0, 1, temp.shape[0])
Y = np.uint8(normalize(y) * 255)
Y = np.tile(Y, [512, 1])R = temp
G = X
B = np.rot90(Y)plt.figure(figsize=(20, 5))
plt.gray()
plt.subplot(141), plt.imshow(R, vmin=0, vmax=255), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(G, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(B, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])img = np.dstack([R, G, B])
plt.subplot(144),plt.imshow(img), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# RGB 三個隱藏面,G = 0
temp = np.zeros([512, 512], np.uint8)x = np.linspace(0, 1, temp.shape[0])
X = np.uint8(normalize(x) * 255)
X = np.tile(X, [512, 1])y = np.linspace(0, 1, temp.shape[0])
Y = np.uint8(normalize(y) * 255)
Y = np.tile(Y, [512, 1])G = temp
R = np.flip(X)
B = np.rot90(Y)plt.figure(figsize=(20, 5))
plt.gray()
plt.subplot(141), plt.imshow(R, vmin=0, vmax=255), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(G, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(B, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])img = np.dstack([R, G, B])
plt.subplot(144),plt.imshow(img), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# RGB 三個隱藏面,B = 0
temp = np.zeros([512, 512], np.uint8)x = np.linspace(0, 1, temp.shape[0])
X = np.uint8(normalize(x) * 255)
X = np.tile(X, [512, 1])y = np.linspace(0, 1, temp.shape[0])
Y = np.uint8(normalize(y) * 255)
Y = np.tile(Y, [512, 1])B = temp
G = X
R = np.rot90(np.fliplr(Y))plt.figure(figsize=(20, 5))
plt.gray()
plt.subplot(141), plt.imshow(R, vmin=0, vmax=255), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(G, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(B, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])img = np.dstack([R, G, B])
plt.subplot(144),plt.imshow(img), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

RGB to Gray

模式“L”:

模式“L”為灰色圖像,它的每個像素用8個bit表示,0表示黑,255表示白,其他數字表示不同的灰度。在PIL中,從模式“RGB”轉換為“L”模式是按照下面的公式轉換的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif')img_rgb = img_ori[:, :, ::-1] # 這個下面實現是一樣的效果[0, 1, 2], 反轉為[2, 1, 0]
# img_rgb = img_ori[..., ::-1]plt.figure(figsize=(20, 5))img_b = img_ori[:, :, 0]
img_g = img_ori[:, :, 1]
img_r = img_ori[:, :, 2]plt.subplot(141), plt.imshow(img_rgb), plt.title('Original'), plt.xticks([]), plt.yticks([])plt.gray()
plt.subplot(142), plt.imshow(img_b, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(img_g, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(144), plt.imshow(img_r, ), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])plt.tight_layout()
plt.show()

在這里插入圖片描述

def rgb2gray(img):"""convert RGB image to gray imageparam: img: input RGB 3 channels imagereturn: grayscale image"""img_gray = np.zeros((img.shape[:2]))img_r = img[:, :, 0].astype(np.float32)img_g = img[:, :, 1].astype(np.float32)img_b = img[:, :, 2].astype(np.float32)img_gray = (img_r * 299 + img_g * 587 + img_b * 114) / 1000img_gray = (normalize(img_gray) * 255).astype(np.uint8)return img_graydef bgr2gray(img):"""convert RGB image to gray imageparam: img: input RGB 3 channels imagereturn: grayscale image"""img_gray = np.zeros((img.shape[:2]))img_r = img[:, :, 2].astype(np.float32)img_g = img[:, :, 1].astype(np.float32)img_b = img[:, :, 0].astype(np.float32)img_gray = (img_r * 299 + img_g * 587 + img_b * 114) / 1000img_gray = (normalize(img_gray) * 255).astype(np.uint8)return img_gray
# RGB2GRAY
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif') # BGR
img_rgb = img_ori[:, :, ::-1] # 這個下面實現是一樣的效果[0, 1, 2], 反轉為[2, 1, 0]
img_gray = rgb2gray(img_rgb)
bgr_gray = bgr2gray(img_ori)plt.figure(figsize=(20, 5))
plt.subplot(141), plt.imshow(img_rgb), plt.title('Original'), plt.xticks([]), plt.yticks([])plt.gray()
plt.subplot(142), plt.imshow(img_gray, ), plt.title('RGB to Gray'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(bgr_gray, ), plt.title('BGR to Gray'), plt.xticks([]), plt.yticks([])
# plt.subplot(144), plt.imshow(img_r, ), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

CMK和CMYK 彩色模型

RGB 歸一化到【0, 1】

[CMY]=[111]?[RGB]\begin{bmatrix} C \\ M \\ Y\end{bmatrix} = \begin{bmatrix} 1 \\ 1 \\ 1\end{bmatrix} - \begin{bmatrix} R \\ G \\ B\end{bmatrix}???CMY????=???111????????RGB????

從CMY到CMYK的轉換如下:
K=min(C,M,Y)K= min(C,M,Y)K=min(C,M,Y)
K=1K=1K=1,則產生無顏色貢獻的純黑色,由此得出C=0,M=0,Y=0C = 0, M=0, Y=0C=0,M=0,Y=0,否則:
C=(C?K)/(1?K)C = (C - K)/(1 - K)C=(C?K)/(1?K)
M=(M?K)/(1?K)M = (M - K)/(1 - K)M=(M?K)/(1?K)
Y=(Y?k)/(1?K)Y = (Y - k)/(1 - K)Y=(Y?k)/(1?K)

從CMYK到CMY的轉換是:
C=C(1?K)+KC = C(1 - K) + KC=C(1?K)+K
M=M(1?K)+KM = M(1 - K)+ K M=M(1?K)+K
Y=Y(1?K)+KY = Y(1 - K) + KY=Y(1?K)+K

def rgb_2_cmy(img):"""RGB image convert to CMYparam: img: input RGB imagereturn CMY image"""img_norm = normalize(img).astype(np.float32)img_cmy = 1 - img_norm
#     img_cmy = np.uint8(img_cmy * 255)return img_cmy
def rgb_2_cmyk(img):"""RGB image convert to CMYKparam: img: input RGB imagereturn CMYK image"""height, width, channel = img.shapeimg_cmy = 1 - normalize(img).astype(np.float32)img_c = np.zeros((height, width), dtype=np.float32)img_m = np.zeros((height, width), dtype=np.float32)img_y = np.zeros((height, width), dtype=np.float32)img_k = np.zeros((height, width), dtype=np.float32)for h in range(height):for w in range(width):temp = img[h, w]k = min(temp[0], temp[1], temp[2])c, m, y = img_cmy[h, w]if k == 1:img_c[h, w] = 0img_m[h, w] = 0img_y[h, w] = 0img_k[h, w] = 1else:img_c[h, w] = (c - k) / (1 - k)img_m[h, w] = (m - k) / (1 - k)img_y[h, w] = (y - k) / (1 - k)img_k[h, w] = kimg_cmyk = np.dstack((img_c, img_m, img_y, img_k))img_dst = normalize(img_cmyk)
#     img_dst = np.uint8(normalize(img_cmyk) * 255)return img_dst
def rgb_2_cmyk_2(img):"""There still have some problem"""height, width, channel = img.shapeimg_cmy = 1 - normalize(img)k = np.min(img_cmy, axis=2)img_c = img_cmy[:, :, 0]img_m = img_cmy[:, :, 1]img_y = img_cmy[:, :, 2]# 當 K != 1 時img_c = np.where(k == 1, img_c, (img_c - k) / (1 - k + 1e-5))img_m = np.where(k == 1, img_m, (img_m - k) / (1 - k + 1e-5))img_y = np.where(k == 1, img_y, (img_y - k) / (1 - k + 1e-5))# 當 K = 1  時img_c = np.where(k != 1, img_c, 0)img_m = np.where(k != 1, img_m, 0)img_y = np.where(k != 1, img_y, 0)img_cmyk = np.dstack((img_c, img_m, img_y))img_cmyk = normalize(img_cmyk)return img_cmyk
# RGB 2 CMYK
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif')# 這里需要先轉為float,不然會出現意想不到的結果
img_ori_norm = normalize(img_ori).astype(np.float32)img_rgb = img_ori_norm[:, :, ::-1] # 這個下面實現是一樣的效果[0, 1, 2], 反轉為[2, 1, 0]
# img_rgb = img_ori[..., ::-1]
print(img_rgb[0, 0])plt.figure(figsize=(20, 5))img_b = img_ori_norm[:, :, 0]
img_g = img_ori_norm[:, :, 1]
img_r = img_ori_norm[:, :, 2]img_cmy = rgb_2_cmy(img_rgb)
print(img_cmy[0, 0])img_cmyk = rgb_2_cmyk(img_rgb)
print(img_cmyk[0, 0])plt.subplot(141), plt.imshow(img_rgb, ), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(img_cmy, ), plt.title('CMY'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(img_cmyk, ), plt.title('CMYK'), plt.xticks([]), plt.yticks([])
plt.subplot(144), plt.imshow(img_r, ), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])plt.tight_layout()
plt.show()
[0.7882353  0.29411766 0.00392157]
[0.2117647  0.7058823  0.99607843]
[0.78587306 0.9201019  0.9989347  0.7304729 ]

在這里插入圖片描述

# Pillow CMYK
img_ori = PIL.Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif')img_cmyk = img_ori.convert("CMYK")
print(f"Mode: {img_cmyk.mode}, shape: {np.array(img_cmyk).shape}")print(f'Pixel value: RGB: {img_ori.getpixel((0, 0))}, CMYK: {img_cmyk.getpixel((0, 0))}')plt.figure(figsize=(20, 5))
plt.subplot(141), plt.imshow(img_ori, ), plt.title('Original')
plt.subplot(142), plt.imshow(img_cmyk, ), plt.title('CMYK')
plt.tight_layout()
plt.show()
Mode: CMYK, shape: (512, 512, 4)
Pixel value: RGB: (201, 75, 1), CMYK: (54, 180, 254, 0)

在這里插入圖片描述

HSI

H={θ,B≤G360?θ,B>GH = \begin{cases} \theta, & B \leq G \\ 360 - \theta, & B > G \end{cases} H={θ,360?θ,?BGB>G?
θ=arccos[12[(R?G)+(R?B)][(R?G)2+(R?B)(G?B)]1/2]\theta = arccos\bigg[\frac{\frac{1}{2}[(R-G) + (R-B)]}{[(R-G)^2 + (R-B)(G-B)]^{1/2}} \bigg] θ=arccos[[(R?G)2+(R?B)(G?B)]1/221?[(R?G)+(R?B)]?]
S=1?3(R+G+B)[min(R,G,B)]S = 1 - \frac{3}{(R + G + B)}[min(R, G, B)] S=1?(R+G+B)3?[min(R,G,B)]
I=13(R+G+B)I = \frac{1}{3}(R + G + B) I=31?(R+G+B)

RGB 值已被歸一化到區間【0,1】,并且角度θ\thetaθ是相對于HSI空間的紅色軸來測量的,將得到的所有值除以360,可將色調歸一化到區間【0, 1】。

def rgb2hsi(img):"""RGB image convert to CMYKparam: img: input RGB imagereturn CMYK image"""img_rgb = img.copy()H = np.zeros(img_rgb.shape[:2])S = np.zeros(img_rgb.shape[:2])I = np.zeros(img_rgb.shape[:2])height, width = img_rgb.shape[:2]for h in range(height):for w in range(width):temp = img_rgb[h, w]R = temp[0]G = temp[1]B = temp[2]numerator = ((R - G) + (R - B)) / 2denominator = np.power((R - G)**2 + (R - B) * (G - B), 1/2)theta = np.arccos(numerator / (denominator + 1e-5))print(theta)if B <= G:H[h, w] = theta / 360else:H[h, w] = (360 - theta) / 360S[h, w] = 1 - ((3 * min(R, G, B))/ (R + G + B + 1e-5))I[h, w] = (R + G + B + 1e-5) / 3img_HSI = np.dstack((H, S, I))img_HSI = np.uint8(normalize(img_HSI) * 255)return img_HSI
# RGB 2 HSI
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif')img_ori_norm = normalize(img_ori)img_rgb = img_ori_norm[:, :, ::-1] # 這個下面實現是一樣的效果[0, 1, 2], 反轉為[2, 1, 0]
# img_rgb = img_ori[..., ::-1]
print(img_rgb[0, 0])plt.figure(figsize=(20, 5))# 這里需要先轉為float,不然會出現意想不到的結果
img_b = img_ori_norm[:, :, 0].astype(np.float32)
img_g = img_ori_norm[:, :, 1].astype(np.float32)
img_r = img_ori_norm[:, :, 2].astype(np.float32)H = np.zeros(img_rgb.shape[:2])
S = np.zeros(img_rgb.shape[:2])
I = np.zeros(img_rgb.shape[:2])height, width = img_rgb.shape[:2]
for h in range(height):for w in range(width):R = img_r[h, w]G = img_g[h, w]B = img_b[h, w]numerator = ((R - G) + (R - B))denominator = 2 * np.sqrt((R - G)**2 + (R - B) * (G - B))theta = np.arccos(numerator / (denominator + 1e-5))degree = np.rad2deg(theta)
#         print(degree)if B <= G:H[h, w] = degreeelse:H[h, w] = (360 - degree)S[h, w] = 1 - ((3 * min(R, G, B))/ (R + G + B + 1e-5))I[h, w] = (R + G + B) / 3H = normalize(H)
H = H.reshape(H.shape[0], H.shape[1], 1)
S = S.reshape(S.shape[0], S.shape[1], 1)
I = I.reshape(H.shape[0], H.shape[1], 1)
S = normalize(S)
I = normalize(I)
img_HSI = np.concatenate((H, S, I), axis=2)
# img_HSI = img_HSI.reshape(img_ori.shape[0], img_ori.shape[1], 3)
# img_HSI = img_HSI.transpose((1, 2, 0))
print(img_HSI.shape)
# img_HSI = np.uint8(normalize(img_HSI) * 255)plt.subplot(141), plt.imshow(img_rgb, ), plt.title('Original')plt.subplot(142), plt.imshow(img_HSI, ), plt.title('HSI')
# plt.subplot(143), plt.imshow(img_cmyk, ), plt.title('CMYK')
# plt.subplot(144), plt.imshow(img_r, ), plt.title('Red Channel')plt.tight_layout()
plt.show()
[0.78823529 0.29411765 0.00392157]
(512, 512, 3)

在這里插入圖片描述

# RGB 2 HSI
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif')img_hsi = cv2.cvtColor(img_ori, cv2.COLOR_BGR2HSV_FULL)      plt.figure(figsize=(20, 5))
plt.subplot(141), plt.imshow(img_rgb, ), plt.title('Original')plt.subplot(142), plt.imshow(img_hsi, ), plt.title('HSI')
# plt.subplot(143), plt.imshow(img_cmyk, ), plt.title('CMYK')
# plt.subplot(144), plt.imshow(img_r, ), plt.title('Red Channel')plt.tight_layout()
plt.show()

在這里插入圖片描述

img_ori = PIL.Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0646(a)(lenna_original_RGB).tif')img_HSI = img_ori.convert("HSV")
print(f"Mode: {img_HSI.mode}, shape: {np.array(img_HSI).shape}")print(f'Pixel value: RGB: {img_ori.getpixel((0, 0))}, HSI: {img_HSI.getpixel((0, 0))}')plt.figure(figsize=(20, 5))
plt.subplot(141), plt.imshow(img_ori, ), plt.title('Original')
plt.subplot(142), plt.imshow(img_HSI, ), plt.title('HSI')
plt.tight_layout()
plt.show()
Mode: HSV, shape: (512, 512, 3)
Pixel value: RGB: (201, 75, 1), HSI: (15, 253, 201)

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 命令詳解_再次學習Git版本控制工具

微信公眾號&#xff1a;PHP在線Git 究竟是怎樣的一個系統呢&#xff1f;為什么在SVN作為版本控制工具已經非常流行的時候&#xff0c;還有Git這樣一個版本控制工具呢&#xff1f;Git和SVN的區別在哪兒呢&#xff1f;Git優勢又在哪呢&#xff1f;下面PHP程序員雷雪松帶你一起詳細…

python twisted和flask_淺談Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid...

Django 是一個高級的 Python Web 框架&#xff0c;支持快速開發&#xff0c;簡潔、實用的設計。如果你正在建一個和電子商務網站相似的應用&#xff0c;那你應該選擇用 Django 框架。它能使你快速完成工作&#xff0c;也不必擔心太多的技術選擇。它能提供從模版引擎到 ORM 所需…

spring-boot 定時任務

2019獨角獸企業重金招聘Python工程師標準>>> 1、建立項目 SpringBootApplication EnableAsync EnableScheduling EnableAutoConfiguration(exclude{ DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) ImportResource(…

使用Lightbox制作照片條

前言&#xff1a;這是國外的一個教程&#xff0c;我也很喜歡這個網頁里面的教程&#xff0c;主要技術是CSS3和JQuery以及一些JQuery的插件的應用&#xff0c;當然從這些教程我也學到了他們制作時的一些思路&#xff0c;就好像做數學題那樣&#xff0c;只要思路把握了&#xff0…

iOS- 如何改變section header

希望這個從UITableViewDelegate協議里得到的方法可以對你有所幫助&#xff1a; - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {UIView *headerView [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.…

第6章 Python 數字圖像處理(DIP) - 彩色圖像處理2 - 灰度分層(灰度分割)和彩色編碼,灰度值到彩色變換,Gray to RGB

第6章主要講的是彩色圖像處理&#xff0c;一些彩色模型如RGB&#xff0c;CMK&#xff0c;CMYK&#xff0c;HSI等色彩模型&#xff1b;彩色模型的變換關系&#xff1b;還包含由灰度圖像怎樣處理成假彩色圖像&#xff1b;使用彩色分割圖像等。本章比較少理論還有變換的描述&#…

值重新賦值_JavaScript-賦值運算符

好好學習&#xff0c;天天向上賦值運算符賦值運算符必須有變量參與運算&#xff0c;賦值運算符會做兩件事情第一&#xff0c;將變量中原始值參與對應數學運算&#xff0c;與右側的數據第二&#xff0c;將運算結果再重新賦值給變量變量位于操作符的左側賦值運算符符號&#xff1…

超聲換能器的原理及設計_超聲波發生器、變幅桿、焊頭的匹配介紹

一.超聲波換能器原理與設計(超聲波振動系統)匹配摘要&#xff1a;就塑料焊接機的超聲波換能器系統進行設計和計算&#xff0c;并用PRO- E 三維軟件繪出三維模型&#xff0c;最后進行頻率分析&#xff0c;為超聲波換能系統提供了有用的設計方法。關鍵詞&#xff1a;超聲波換能器…

位圖法

判斷集合中存在重復是常見編程任務之一&#xff0c;當集合中數據量比較大時我們通常希望少進行幾次掃描&#xff0c;這時雙重循環法就不可取了。位圖法比較適合于這種情況&#xff0c;它的做法是按照集合中最大元素max創建一個長度為max1的新數組&#xff0c;然后再次掃描原數組…

CentOS查看和修改PATH環境變量的方法

為什么80%的碼農都做不了架構師&#xff1f;>>> 查看PATH&#xff1a;echo $PATH 以添加mongodb server為列 修改方法一&#xff1a; export PATH/usr/local/mongodb/bin:$PATH //配置完后可以通過echo $PATH查看配置結果。 生效方法&#xff1a;立即生效 有效期限…

IOS簡單的登陸界面

主要需要注意的幾個問題&#xff1a; 1.導入圖片方式最好用文件導入 代碼: 在ViewController.m文件中 2.UILable常用屬性 property(nonatomic,copy) NSString *text; //設置文本內容 property(nonatomic,retain) UIFont *font; //設置字體 …

第6章 Python 數字圖像處理(DIP) - 彩色圖像處理3 -色彩變換、彩色校正、彩色圖像平滑和銳化、HSI彩色空間中的分割、RGB空間中的分割、彩色邊緣檢測

這里寫目錄標題色彩變換彩色圖像平滑和銳化使用彩色分割圖像HSI 彩色空間中的分割RGB空間中的分割彩色邊緣檢測彩色圖像中的噪聲色彩變換 # 圖像顏色分量的顯示 from PIL import Imageimg_ori Image.open(DIP_Figures/DIP3E_Original_Images_CH06/Fig0630(01)(strawberries_f…

javascript 在對象中使用 定時器_如何使用JavaScript 面向對象編程

學習目標理解面向對象開發思想掌握 JavaScript 面向對象開發相關模式面向對象介紹什么是對象Everything is object (一切皆對象)我們可以從兩個層次來理解對象&#xff1a;(1) 對象是單個事物的抽象。一本書、一輛汽車、一個人都可以是對象&#xff0c;一個數據庫、一張網頁、一…

char數組轉string_String類和其它數據類型的相互轉換

對于上面的這些包裝類&#xff0c;除了Character以外&#xff0c;都有可以直接使用字符串參數的構造函數&#xff0c;這也就使得我們將String類轉換為這些數據類型變得相當之簡單&#xff0c;即&#xff1a;Boolean(String s)、Integer(String s)、Long(String s)、Float(Strin…

ORACLE 各種閃回操作

1、Flashback Database&#xff08;利用閃回日志恢復&#xff09; Oracle Flashback Database特性允許通過SQL語句Flashback Database語句&#xff0c;讓數據庫前滾到當前的前一個時間點或者SCN&#xff0c;而不需要做時間點的恢復。閃回數據庫可以迅速將數據庫回到誤操作或人為…

【轉】介紹設置Session失效的幾種方法

轉載地址&#xff1a;http://developer.51cto.com/art/201106/269493.htm Session對象是HttpSessionState的一個實例。該類為當前用戶會話提供信息&#xff0c;還提供對可用于存儲信息會話范圍的緩存的訪問&#xff0c;以及控制如何管理會話的方法。下面介紹設置session失效的幾…

mysql導入數據load data infile用法整理

有時候我們需要將大量數據批量寫入數據庫&#xff0c;直接使用程序語言和Sql寫入往往很耗時間&#xff0c;其中有一種方案就是使用MySql Load data infile導入文件的形式導入數據&#xff0c;這樣可大大縮短數據導入時間。 假如是從MySql客戶端調用&#xff0c;將客戶端的文件導…

python3循環一直到一個值結束_一步一步學Python3(小學生也適用) 第十七篇:循環語句for in循環...

一、Python for in循環Python for in 循環&#xff0c;是用來遍歷任何數據序列&#xff0c;如一個列表&#xff0c;一個字符串&#xff0c;一個字典&#xff0c;一個元組等。for in 循環的一般語法如下&#xff1a;for item in 序列:語句塊else:語句塊for in 字符串&#xff1…

設置Jupyter notebook 默認工作路徑,修改Jupyter notebook 默認瀏覽器為Chrome

這里寫目錄標題一 設置Jupyter notebook 默認工作路徑二 修改Jupyter notebook 默認瀏覽器為Chrome一 設置Jupyter notebook 默認工作路徑 安裝好anaconda 后&#xff0c;jupyter notebook默認是有安裝好的。在windows的菜單欄找到anaconda目錄&#xff0c;如下圖 鼠標右鍵點…

python調用c#注意事項_Python調用C#編寫的DLL

起因是工作中需要用的開發編寫的DLL&#xff0c;但是它是使用C#編寫的&#xff0c;本人不想使用C#去寫測試代碼&#xff0c;所以需要使用Python來掉這個DLL內的方法 就用這個就很好&#xff0c;不要問為啥不用微軟的Ironpython和別的啥&#xff0c;好用就行了&#xff0c;解決問…