Python-OpenCV中的圖像處理-圖像直方圖

Python-OpenCV中的圖像處理-圖像直方圖

  • 圖像直方圖
    • 統計直方圖
    • 繪制直方圖
      • Matplotlib繪制灰度直方圖
      • Matplotlib繪制RGB直方圖
    • 使用掩膜統計直方圖
    • 直方圖均衡化
      • Numpy圖像直方圖均衡化
      • OpenCV中的直方圖均衡化
      • CLAHE 有限對比適應性直方圖均衡化
    • 2D直方圖
      • OpenCV中的2D直方圖
      • Numpy中2D直方圖
    • 直方圖反射投影
      • Numpy 中的直方圖反射投影算法
      • OpenCV中的直方圖反射投影算法

圖像直方圖

  • 通過直方圖你可以對整幅圖像的灰度分布有一個整體的了解。直方圖的 x 軸是灰度值( 0 到 255), y 軸是圖片中具有同一個灰度的點的數目。
  • BINS:上面的直方圖顯示了每個灰度值對應的像素數。如果像素值為 0到255,你就需要 256 個數來顯示上面的直方圖。但是,如果你不需要知道每一個像素值的像素點數目的,而只希望知道兩個像素值之間的像素點數目怎么辦呢?舉例來說,我們想知道像素值在 0 到 15 之間的像素點的數目,接著是 16 到31,…, 240 到 255。我們只需要 16 個值來繪制直方圖。
  • DIMS:表示我們收集數據的參數數目。在本例中,我們對收集到的數據只考慮一件事:灰度值。所以這里就是 1。
  • RANGE:就是要統計的灰度值范圍,一般來說為 [0, 256],也就是說所有的灰度值。

統計直方圖

  • cv2.calcHist():OpenCV統計直方圖
    cv2:calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]])
    1. images: 原圖像(圖像格式為 uint8 或 float32)。當傳入函數時應該
      用中括號 [] 括起來,例如: [img]。
    2. channels: 同樣需要用中括號括起來,它會告訴函數我們要統計那幅圖
      像的直方圖。如果輸入圖像是灰度圖,它的值就是 [0];如果是彩色圖像
      的話,傳入的參數可以是 [0], [1], [2] 它們分別對應著通道 B, G, R。
    3. mask: 掩模圖像。要統計整幅圖像的直方圖就把它設為 None。但是如
      果你想統計圖像某一部分的直方圖的話,你就需要制作一個掩模圖像,并
      使用它。(后邊有例子)
    4. histSize:BIN 的數目。也應該用中括號括起來,例如: [256]。
    5. ranges: 像素值范圍,通常為 [0, 256]

    img = cv2.imread(‘home.jpg’,0)
    #別忘了中括號 [img],[0],None,[256],[0,256],只有 mask 沒有中括號
    hist = cv2.calcHist([img],[0],None,[256],[0,256])
    hist 是一個 256x1 的數組,每一個值代表了與次灰度值對應的像素點數目。

  • np.histogram():Numpy統計直方圖
  • np.bincount():Numpy統計直方圖(一維直方圖,速度快)

#img.ravel() 將圖像轉成一維數組,這里沒有中括號。
hist,bins = np.histogram(img.ravel(),256,[0,256])
Numpy 還 有 一 個 函 數 np.bincount(), 它 的 運 行 速 度 是
np.histgram 的 十 倍。 所 以 對 于 一 維 直 方 圖, 我 們 最 好 使 用 這 個函 >數。 使 用 np.bincount 時 別 忘 了 設 置 minlength=256。
hist=np.bincount(img.ravel(), minlength=256)

繪制直方圖

Matplotlib繪制灰度直方圖

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/leuvenA.jpg', cv2.IMREAD_GRAYSCALE)
plt.hist(img.ravel(), 256, [0, 256])
plt.show()

在這里插入圖片描述
在這里插入圖片描述

Matplotlib繪制RGB直方圖

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/leuvenA.jpg', cv2.IMREAD_COLOR)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.xlim([0, 256])
plt.show()

在這里插入圖片描述

使用掩膜統計直方圖

要統計圖像某個局部區域的直方圖只需要構建一副掩模圖像。將要統計的部分設置成白色,其余部分為黑色,就構成了一副掩模圖像。然后把這個掩模圖像傳給函數就可以了。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/leuvenA.jpg', cv2.IMREAD_GRAYSCALE)
h,w = img.shape
print(h,w)# create mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:400, 100:500] = 255
masked_img = cv2.bitwise_and(img, img, mask = mask)hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full, 'r'), plt.plot(hist_mask, 'b')
plt.xlim([0, 256])
plt.show()

紅色線是整幅圖的直方圖,藍色線是掩膜之后的直方圖:
在這里插入圖片描述

直方圖均衡化

  • 如果一副圖像中的大多是像素點的像素值都集中在一個像素值范圍之內會怎樣呢?例如,如果一幅圖片整體很亮,那所有的像素值應該都會很高。但是一副高質量的圖像的像素值分布應該很廣泛。所以你應該把它的直方圖做一個橫向拉伸(如下圖),這就是直方圖均衡化要做的事情。通常情況下這種操作會改善圖像的對比度。在這里插入圖片描述

  • 直方圖均衡化處理可以提高圖像的清晰度

Numpy圖像直方圖均衡化

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/leuvenA.jpg', cv2.IMREAD_GRAYSCALE)# 1.使用Numpy統計原圖直方圖
# flatten() 將數組變成一維
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# 計算累積分布圖
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()# 2.使用Numpy直方圖均衡化處理
# 構建 Numpy 掩模數組, cdf 為原數組,當數組元素為 0 時,掩蓋(計算時被忽略)。
cdf_m = np.ma.masked_equal(cdf, 0)
cdf_m = (cdf_m - cdf_m.min()) *255/(cdf_m.max() - cdf_m.min())
# 對被掩蓋的元素賦值,這里賦值為 0
cdf = np.ma.filled(cdf_m, 0).astype('uint8')
# 現在就獲得了一個表,我們可以通過查表得知與輸入像素對應的輸出像素的值。我們只需要把這種變換應用到圖像上就可以了
img2 = cdf[img]# 3. 繪制原圖直方圖
plt.subplot(221), plt.imshow(cv2.cvtColor(img, cv2.COLOR_GRAY2RGB))
plt.subplot(222)
plt.plot(cdf_normalized, color='b')
plt.hist(img.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')# 4.繪制均衡化直方圖
plt.subplot(223), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_GRAY2RGB))
plt.subplot(224)
plt.plot(cdf_m, color='g')
plt.hist(img2.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')plt.show()

在這里插入圖片描述

OpenCV中的直方圖均衡化

OpenCV 中的直方圖均衡化函數為 cv2.equalizeHist()。這個函數的輸入圖片僅僅是一副灰度圖像,輸出結果是直方圖均衡化之后的圖像。

import numpy as np
import cv2img = cv2.imread('./resource/opencv/image/leuvenA.jpg', cv2.IMREAD_GRAYSCALE)
# 直方圖均衡化
equ = cv2.equalizeHist(img)
# 圖像拼接,左邊原圖,右邊直方圖均衡化之后的圖像
res = np.hstack((img, equ))cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

左邊原圖,右邊直方圖均衡化之后的圖像
在這里插入圖片描述

CLAHE 有限對比適應性直方圖均衡化

文章上邊做的直方圖均衡化會改變整個圖像的對比度,但是在很多情況下,這樣做的效果并不好。例如,下圖分別是輸入圖像和進行直方圖均衡化之后的輸出圖像。的確在進行完直方圖均衡化之后,圖片背景的對比度被改變了。但是你再
對比一下兩幅圖像中雕像的面圖,由于太亮我們丟失了很多信息。
在這里插入圖片描述
為了解決這個問題,我們需要使用自適應的直方圖均衡化。這種情況下,整幅圖像會被分成很多小塊,這些小塊被稱為“tiles”(在 OpenCV 中 tiles 的大小默認是 8x8),然后再對每一個小塊分別進行直方圖均衡化(跟前面類似)。所以在每一個的區域中,直方圖會集中在某一個小的區域中(除非有噪聲干擾)。如果有噪聲的話,噪聲會被放大。為了避免這種情況的出現要使用對比度限制。對于每個小塊來說,如果直方圖中的 bin 超過對比度的上限的話,就把其中的像素點均勻分散到其他 bins 中,然后在進行直方圖均衡化。最后,為了去除每一個小塊之間“人造的”(由于算法造成)邊界,再使用雙線性差值,對小塊進行縫合。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/clahe_2.jpg', cv2.IMREAD_GRAYSCALE)# 均衡化處理
equ = cv2.equalizeHist(img)# 自適應均衡化處理
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)# 繪制圖像
plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)), plt.title('img')
plt.subplot(132), plt.imshow(cv2.cvtColor(equ, cv2.COLOR_GRAY2RGB)), plt.title('equ')
plt.subplot(133), plt.imshow(cv2.cvtColor(cl1, cv2.COLOR_GRAY2RGB)), plt.title('cl1')
plt.show()

在這里插入圖片描述

2D直方圖

在前面的文章介紹了如何繪制一維直方圖,之所以稱為一維,是因為我們只考慮了圖像的一個特征:灰度值。但是在 2D 直方圖中我們就要考慮兩個圖像特征。對于彩色圖像的直方圖通常情況下我們需要考慮每個的顏色( Hue)和飽和度( Saturation)。根據這兩個特征繪制 2D 直方圖。

OpenCV中的2D直方圖

使用函數 cv2.calcHist() 來計算直方圖既簡單又方便。如果要繪制顏色直方圖的話,我們首先需要將圖像的顏色空間從 BGR 轉換到 HSV。(記住,計算一維直方圖,要從 BGR 轉換到 HSV)。計算 2D 直方圖,函數的參數要做如下修改:

  • channels=[0, 1] 因為我們需要同時處理 H 和 S 兩個通道。
  • bins=[180, 256]H 通道為 180, S 通道為 256。
  • range=[0, 180, 0, 256]H 的取值范圍在 0 到 180, S 的取值范圍在 0 到 256。
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/home.jpg', cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), 'gray')
plt.subplot(122), plt.imshow(hist, interpolation = 'nearest')
plt.show()

在這里插入圖片描述

Numpy中2D直方圖

Numpy 同樣提供了繪制 2D 直方圖的函數:

  • np.histogram():一維直方圖
  • np.histogram2d():二緯直方圖
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/home.jpg', cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)#分離通道
hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.subplot(132), plt.imshow(hist)
plt.show()

在這里插入圖片描述

直方圖反射投影

  • 直方圖反向投影是由 Michael J. Swain 和 Dana H. Ballard 在他們的文章“Indexing via color histograms”中提出。
  • 它可以用來做圖像分割,或者在圖像中找尋我們感興趣的部分。簡單來說,它會輸出與輸入圖像(待搜索)同樣大小的圖像,其中的每一個像素值代表了輸入圖像上對應點屬于目標對象的概率。用更簡單的話來解釋,輸出圖像中像素值越高(越白)的點就越可能代表我們要搜索的目標(在輸入圖像所在的位置)。這是一個直觀的解釋。直方圖投影經常與 camshift算法等一起使用。
  • 我們應該怎樣來實現這個算法呢?首先我們要為一張包含我們要查找目標的圖像創建直方圖(在我們的示例中,我們要查找的是草地,其他的都不要)。我們要查找的對象要盡量占滿這張圖像(換句話說,這張圖像上最好是有且僅有我們要查找的對象)。最好使用顏色直方圖,因為一個物體的顏色要比它的灰度能更好的被用來進行圖像分割與對象識別。接著我們再把這個顏色直方圖投影到輸入圖像中尋找我們的目標,也就是找到輸入圖像中的每一個像素點的像素值在直方圖中對應的概率,這樣我們就得到一個概率圖像,最后設置適當的閾值對概率圖像進行二值化,就這么簡單。

Numpy 中的直方圖反射投影算法

首先,我們要創建兩幅顏色直方圖,目標圖像的直方圖( ‘M’),(待搜索)輸入圖像的直方圖( ‘I’)。

import numpy as np
import cv2
from matplotlib import pyplot as pltroi = cv2.imread('./resource/opencv/image/target.jpg', cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)target = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_COLOR)
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)M = cv2.calcHist([hsv],  [0, 1], None, [180, 256], [0, 180, 0, 256])
I = cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])# 計算比值: R = M/I 。反向投影 R,也就是根據 R 這個”調色板“創建一
# 副新的圖像,其中的每一個像素代表這個點就是目標的概率。
# 例如 B (x; y) = R [h (x; y) ; s (x; y)],
# 其中 h 為點( x, y)處的 hue 值, s 為點( x, y)處的
# saturation 值。最后加入再一個條件 B (x; y) = min [B (x; y) ; 1]
R = M/Ih, s, v = cv2.split(hsvt)
B = R[h.ravel(), s.ravel()]
B = np.minimum(B, 1)
B = B.reshape(hsvt.shape[:2])# 現在使用一個圓盤算子做卷積, B = D × B,其中 D 為卷積核
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
B = cv2.filter2D(B, -1, disc)
B = np.uint8(B)# 歸一化處理
cv2.normalize(B,B,0,255,cv2.NORM_MINMAX)
ret, thresh = cv2.threshold(B, 50, 255, 0)
# 別忘了是三通道圖像,因此這里使用 merge 變成 3 通道
thresh = cv2.merge((thresh,thresh,thresh))
res = cv2.bitwise_and(target, thresh)res = np.hstack((target, thresh, res))
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

程序運行結果:
在這里插入圖片描述
target.jpg:是另外一副圖草地區域的一塊截圖
在這里插入圖片描述
messi5.jpg:
在這里插入圖片描述

OpenCV中的直方圖反射投影算法

OpenCV 提供的函數 cv2.calcBackProject() 可以用來做直方圖反向投影。它的參數與函數 cv2.calcHist 的參數基本相同。其中的一個參數是我們要查找目標的直方圖。同樣再使用目標的直方圖做反向投影之前我們應該先對其做歸一化處理。返回的結果是一個概率圖像,我們再使用一個圓盤形卷積核對其做卷操作,最后使用閾值進行二值化。

import cv2
import numpy as nproi = cv2.imread('./resource/opencv/image/target.jpg', cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)target = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_COLOR)
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)# calculating object histogram
roihist = cv2.calcHist([hsv], [0,1], None, [180, 256], [0, 180, 0, 256])# normalize histogram and apply backprojection
# 歸一化:原始圖像,結果圖像,映射到結果圖像中的最小值,最大值,歸一化類型
#cv2.NORM_MINMAX 對數組的所有值進行轉化,使它們線性映射到最小值和最大值之間
# 歸一化之后的直方圖便于顯示,歸一化之后就成了 0 到 255 之間的數了
cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsvt], [0, 1], roihist, [0, 180, 0, 256], 1)# Now convolute with circular disc
# 此處卷積可以把分散的點連在一起
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
dst = cv2.filter2D(dst, -1, disc)# threshold and binary AND
ret, thresh = cv2.threshold(dst, 50, 255, 0)
# 別忘了是三通道圖像,因此這里使用 merge 變成 3 通道
thresh = cv2.merge((thresh,thresh,thresh))
res = cv2.bitwise_and(target, thresh)res = np.hstack((target, thresh, res))
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

程序運行結果:
在這里插入圖片描述
target.jpg:是另外一副圖草地區域的一塊截圖
在這里插入圖片描述
messi5.jpg:
在這里插入圖片描述

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

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

相關文章

代碼隨想錄算法訓練營20期|第七天|哈希表part02|454.四數相加II ● 383. 贖金信 ● 15. 三數之和 ● 18. 四數之和 ● 總結

454.四數相加II 比較巧思的解法,先把nums1 和nums2的數兩兩相加,并存儲sum和次數 再在nums3和nums4里找對應和sum和為0的數值i,j Time: N^2 Space:N^2, 最壞情況下A和B的值各不相同,相加產生的數字個數為 n^2 class Solution {public int fo…

Spring AOP實踐:如何通過aop記錄日志?

目錄 一、依賴 二、自定義注解 三、切面 一、依賴 以SpringBoot工程為例&#xff0c;導入aop的依賴。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 二…

為什么要自動化Web測試?

Web自動化是更快地實現所需結果的較佳方式。自動化測試在市場上引起了巨大的轟動。此軟件測試過程可以讓您使用正確的自動化測試工具和技術集自動執行測試過程。我們執行它是為了檢查軟件應用程序是否具有完全按照我們希望它執行的方式執行的勇氣。 比以往更快地獲得反饋 自動化…

基于Promise.resolve實現Koa請求隊列中間件

本文作者為360奇舞團前端工程師 前言 最近在做一個 AIGC 項目&#xff0c;后端基于 Koa2 實現。其中有一個需求就是調用兄弟業務線服務端 AIGC 能力生成圖片。但由于目前兄弟業務線的 AIGC 項目也是處于測試階段&#xff0c;能夠提供的服務器資源有限&#xff0c;當并發請求資源…

kafka和rabbitmq之間的區別以及適用場景

Kafka 和 RabbitMQ 都是流行的消息傳遞系統&#xff0c;用于實現分布式系統中的消息傳遞、事件處理和數據流。它們在設計和適用場景上有一些不同&#xff0c;下面詳細介紹它們之間的區別和適用場景。 Kafka 特點和優勢&#xff1a; 高吞吐量&#xff1a; Kafka 的設計目標是實…

【Java】數據交換 Json 和 異步請求 Ajax

&#x1f384;歡迎來到邊境矢夢的csdn博文&#xff0c;本文主要講解Java 中 數據交換和異步請求 Json&Ajax 的相關知識&#x1f384; &#x1f308;我是邊境矢夢&#xff0c;一個正在為秋招和算法競賽做準備的學生&#x1f308; &#x1f386;喜歡的朋友可以關注一下&#…

go mod 添加私有庫GOPRIVATE

私有地址 形式倉庫域名/組織名形式倉庫域名形式*倉庫域名 示例私有地址&#xff1a; gitee.com/takujo_admin 或者igitlab.com 多個私有地址,分割&#xff0c;示例&#xff1a; gitee.com,igitlab.com 修改env go env -w GOPRIVATE"私有地址" go env -w …

conda創建虛擬環境

創建虛擬環境是在計算機上設置一個獨立的空間&#xff0c;用于安裝和運行特定版本的軟件和依賴項&#xff0c;以避免與系統其他部分的沖突。 創建虛擬環境&#xff1a; conda create --name myenv python3.8 這將創建一個名為myenv的虛擬環境&#xff0c;并安裝Python 3.8版本。…

pwm接喇叭搞整點報時[keyestudio的8002模塊]

雖然現在查看時間很方便&#xff0c;但是其實好像我的時間觀念卻越來越差。于是決定搞一個整點報時&#xff0c;時常提醒自己時光飛逝&#xff0c;不要老是瞎墨跡。 這篇主要講一下拼裝方式和配置&#xff0c;就差不多了。不涉及什么代碼。3針的元器件&#xff0c;去掉正負接線…

day3 STM32 GPIO口介紹

GPIO接口簡介 通用輸入輸出接口GPIO是嵌入式系統、單片機開發過程最常用的接口&#xff0c;用戶可以通過編程靈活的對接口進行控制&#xff0c;實現對電路板上LED、數碼管、按鍵等常用設備控制驅動&#xff0c;也可以作為串口的數據收發管腳&#xff0c;或AD的接口等復用功能使…

網絡安全--iptables(待更新,累了)

總結&#xff1a; iptables 的關鍵概念和功能&#xff1a; 規則&#xff08;Rules&#xff09;&#xff1a; iptables 使用規則來定義特定的操作&#xff0c;例如允許或拒絕特定類型的網絡流量。每條規則都由條件和操作組成。條件可以是源 IP 地址、目標 IP 地址、端口號等&a…

thinkphp:對數據庫減少增加某個字段的值(dec、inc的用法)

例子&#xff1a;當字段po_num的值等于數組list_info中的po_num的值時修改數據庫表po_rcv_receipt_line中某些信息&#xff1a; 1、數據庫delivery_quantity字段的值 數據庫中delivery_quantity的值變量$list_info[write_quantity] ->inc(delivery_quantity, $list_info[…

【設計模式——學習筆記】23種設計模式——狀態模式State(原理講解+應用場景介紹+案例介紹+Java代碼實現)

文章目錄 案例引入介紹基本介紹登場角色應用場景 案例實現案例一類圖實現 案例二&#xff1a;借貸平臺源碼剖析傳統方式實現分析狀態修改流程類圖實現 案例三&#xff1a;金庫警報系統系統的運行邏輯偽代碼傳統實現方式使用狀態模式 類圖實現分析問題問題一問題二 總結文章說明…

國內芯片廠商創新突破,助力國產替代持續加速

近日&#xff0c;中商產業研究院發布最新研究報告顯示&#xff0c;今年1~5月份中國進口集成電路為1865億件&#xff0c;同比下降19.6%&#xff0c;同比去年5個月累計少進口了455億顆&#xff0c;平均每天少進口3億顆。與此同時&#xff0c;英特爾、AMD、美光、三星、SK海力士等…

OSI七層模型和TCP/IP四層模型

OSI七層模型和TCP/IP四層模型 七層模型(OSI) OSI七層模型&#xff08;Open Systems Interconnection Reference Model&#xff09;是一個用于計算機網絡體系結構的標準化框架&#xff0c;旨在定義網絡通信中不同層次的功能和協議。 各個層次具體如下&#xff1a; 物理層&am…

C語言 冒泡排序

目錄 一、原理 二、代碼演示 三、代碼優化 一、原理 假設&#xff1a; int arr[] { 9,8,7,6,5,4,3,2,1,0 }; 將 arr 內的元素進行升序排列&#xff0c;得到一個新的數組 int arr[] { 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;…

windows docker mysql8.0 掛載配置文件不生效的問題

原因 mysql 8.0 遇到sql_modeonly_full_group_by的問題&#xff0c;于是就自定義my.cnf 去掉only_full_group_by&#xff0c;修改my.cnf 文件后&#xff0c;進行映射啟動 docker run 命令 docker run -p 3306:3306 --privilegedtrue --restartalways -d --name axsc-mysql -…

【0814作業】多線程并發服務器

1) 代碼 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <string.h> #include <stdlib.h> #include <signal.h> #include <sys/wait.h> #include <netinet/in.h>…

配置文件優先級解讀

目錄 概述 同級目錄application配置文件優先級 application 以及bootstrap 優先級 不同級目錄配置文件優先級 外部配置加載順序 概述 SpringBoot除了支持properties格式的配置文件&#xff0c;還支持另外兩種格式的配置文件。三種配置文件格式分別如下: properties格式…

Python學習筆記_基礎篇(二)_數據類型之字符串

一.基本數據類型 整數&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一個tab鍵) 布爾值&#xff1a; bool 列表&#xff1a;list 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&#xff1a;所有的數據類型都存在想對應…