主頁 > 後端開發 > 數字影像處理學習筆記之——影像的點運算

數字影像處理學習筆記之——影像的點運算

2020-11-05 23:26:32 後端開發

影像的點運算

1、灰度直方圖

灰度直方圖描述了一幅影像的灰度級統計資訊,主要應用于影像分割和影像灰度變換等處理程序中,

1.1、理論基礎

從數學上來說,影像直方圖描述影像的各個灰度級的統計特性,它是影像灰度值的函式,統計一幅影像中各個灰度級出現的次數或概率,有一種特殊的直方圖叫做歸一化直方圖可以直接反映不同灰度級出現的頻率

從圖形上來說,灰度直方圖是一個二維圖,橫坐標為影像中各個像素點的灰度級別,縱坐標表示具有各個灰度級別的像素在影像中出現的次數或概率,

灰度直方圖的計算是根據其統計定義進行的,影像的灰度直方圖是一個離散函式,它表示影像每一灰度級與該灰度級出現的頻率的對應關系,假設一幅影像的像素總數為 N灰度級總數為 L,其中灰度級與該灰度級出現的頻率為 Ng,則這幅數字影像的灰度直方圖橫坐標即為灰度 g(0 ≤ g ≤ L-1),縱坐標則為灰度值出現的次數 Ng,實際上,用像素總數 N 去除以各個灰度值出現的次數 Ng 即得到各個灰度級出現的頻率 Pg = Ng/N = Ng /∑Ng ,從而得到歸一化的灰度直方圖,其縱坐標為概率 Pg

1.2、Matlab 實作

Matlab 中的 imhist 函式可以進行影像的灰度直方圖運算,呼叫語法如下:

imhist(I)
imhist(I,n)
[counts,x] = imhist(...)

引數說明

  • I 為需要計算灰度直方圖的影像;
  • n 為指定的灰度級數目,如果指定引數 n,則會將所有的灰度級均分分布在 n 個小區間內,而不是將所有的灰度級全部分開,

回傳值

  • counts 為直方圖資料向量,counts(i) 表示第 i 個灰度區間中的像素數目;
  • x 是保存了對應的灰度小區間的向量,

若呼叫時不接收這個函式的回傳值,則直接顯示直方圖;在得到這些回傳資料之后,也可以使用 stem(x,counts) 來手動繪制直方圖,

  1. 一般直方圖

    灰度直方圖的生成與顯示:

    I = imread('pout.jpeg');    	%讀取影像 pout.jpeg
    figure;                     	%打開一個新視窗
    imshow(I);title('Source');  	%顯示原影像
    figure;                     	%打開一個新視窗
    imhist(I);title('Histogram');   %顯示直方圖
    

    在這里插入圖片描述

    因為相近的灰度值所具有的含義往往是相似的,所以常常沒有必要在每個灰度級上都進行統計,下面的命令將 0~255 總共 256 個灰度級劃分為 64 個長度為 4 的灰度區間,此時縱坐標分別統計每個灰度區間中的像素在影像中出現次數,

在這里插入圖片描述

  1. 歸一化直方圖

    在 imhist 函式的回傳值中,counts 保存了落在每個區間的像素的個數,通過計算 counts 與影像中像素點的商可以得到歸一化的直方圖,

    繪制有 32 個灰度區間的歸一化直方圖程式如下:

    figure;
    [M,N] = size(I);            %計算影像大小
    [counts,x] = imhist(I,32);  %計算有 32 個小區間的灰度直方圖
    counts = counts / M / N;    %計算歸一化灰度直方圖各區間的值
    stem(x,counts);             %繪制歸一化直方圖
    

在這里插入圖片描述

分析影像的灰度直方圖往往可以得到很多有用的資訊,例如:可以很直觀地看出影像的亮度和對比度特性(對比度:灰度影像最大亮度與最小亮度的比值),如果影像較亮,則直方圖的峰值出現在直方圖的較右部分;如果影像較暗,則直方圖的峰值出現在直方圖的較左部分,如果直方圖只有中間一小部分非零值,則這張圖片的對比度較低;反之,如果直方圖的非零值分別很寬而且比較均勻,則影像的對比度較高,


2、灰度的線性變換

將影像的像素值通過指定的線性函式進行變換,以此增強或減弱影像的灰度

2.1、理論基礎

線性灰度變換函式 f(x) 是一個一維線性函式:
D B = f ( D A ) = f A D A + f B D_B=f(D_A)=f_AD_A+f_B DB?=f(DA?)=fA?DA?+fB?
式中:引數 fA 為線性函式的斜率;fB 為線性函式在 y 軸的截距;DA 表示輸入影像的灰度;DB 表示輸出影像的灰度

  • fA > 1 時,輸出影像的對比度將增大;當 fA < 1 時,輸出影像的對比度將減小
  • fA = 1 時且 fB ≠ 1 時,操作僅使所有的像素的灰度值上移或下移,其效果是使整個影像更暗或更亮;如 fA < 0 時,暗區域將變亮,亮區域將變暗,這種線性變換可能由于像素亮度達到飽和(小于 0 或超過 255)從而丟失一些細節;
  • 特殊情況下,當 fA = 1, fB = 0 時,輸出影像與輸入影像相同;當 fA = -1, fB = 255 時,輸出影像的灰度正好反轉,灰度反轉處理適用于增強暗色影像中的亮度較大的細節部分,這也是人的視覺性決定的,

2.2、Matlab 實作

% 灰度的線性變換
% 無需專門的函式
% 增加對比度、減小對比度、線性平移增加亮度和反相顯示 4 種線性變換
I = imread('pout.jpeg');  % 讀入原影像

I =  im2double(I);  % 轉換資料型別為 double
[M,N] = size(I);    % 計算影像面積

figure(1);  % 打開新視窗
imshow(I);  % 顯示原影像
title('原影像');

figure(2);
[H,x] = imhist(I,64);   % 計算 64 個小區間的灰度直方圖
stem(x,(H/M/N),'.');    % 顯示原影像的直方圖
title('原影像');

% 增加對比度
Fa = 2; Fb = -55;
O = Fa .* I + Fb/255;

figure(3);
subplot(2,2,1);
imshow(O);
title('Fa = 2 Fb = -55 增加對比度');

figure(4);
subplot(2,2,1);
[H,x] = imhist(O,64);
stem(x,(H/M/N),'.');
title('Fa = 2 Fb = -55 增加對比度');

% 減少對比度
Fa = 0.5; Fb = -55;
O = Fa .* I + Fb/255;

figure(3);
subplot(2,2,2);
imshow(O);
title('Fa = 0.5 Fb = -55 減少對比度');

figure(4);
subplot(2,2,2);
[H,x] = imhist(O,64);
stem(x,(H/M/N),'.');
title('Fa = 0.5 Fb = -55 減少對比度');

% 線性增加亮度
Fa = 1; Fb = 55;
O = Fa .* I + Fb/255;

figure(3);
subplot(2,2,3);
imshow(O);
title('Fa = 1 Fb = 55 線性平移增加亮度');

figure(4);
subplot(2,2,3);
[H,x] = imhist(O,64);
stem(x,(H/M/N),'.');
title('Fa = 1 Fb = 55 線性平移增加亮度');

% 反相顯示
Fa = -1; Fb = 255;
O = Fa .* I + Fb/255;

figure(3);
subplot(2,2,4);
imshow(O);
title('Fa = -1 Fb = 255 反相顯示');

figure(4);
subplot(2,2,4);
[H,x] = imhist(O,64);
stem(x,(H/M/N),'.');
title('Fa = -1 Fb = 255 反相顯示');

結果:

在這里插入圖片描述

在這里插入圖片描述

結論:改變影像的對比度是對直方圖的縮放與平移,改變影像的亮度則只是平移直方圖在橫軸上的位置,而反相則是將直方圖水平鏡像


3、灰度對數變換

3.1、理論基礎

對數變換的一般運算式如下:
t = c l o g ( 1 + s ) t=c \quad log(1+s) t=clog(1+s)
其中 c 為尺度比例常數,s 為源灰度值,t 為變換后的目標灰度值

由對數函式曲線可知,這種變換可以增強一幅影像中較暗部分的細節,從而可用來擴展被壓縮的高值影像中較暗像素,因此對數變換被廣泛地應用于頻譜影像的顯示中,一個典型的應用是傅里葉頻譜,

3.2、Matlab 實作

對數變換不需要專門的影像處理函式,下面的例子比較了對傅里葉頻譜影像進行對數變換前后的效果:

% 對傅里葉頻譜影像進行對數變換
I = imread('pout.jpeg');
F = fft2(im2double(I));     % 計算頻譜
F = fftshift(F);
F = abs(F);
T = log(F + 1);     % 對數變換

subplot(1,2,1);
imshow(F,[]);
title('未經變換的頻譜');

subplot(1,2,2);
imshow(T,[]);
title('對數變換后');

結果:

在這里插入圖片描述

經過對數灰度處理的影像,其低灰度區域對比度將會增加,暗部細節被增強


4、伽瑪變換

4.1、理論基礎

伽瑪變換的一般運算式:
y = ( x + e s p ) γ y=(x+esp)^\gamma y=(x+esp)γ
式中:x 與 y 的取值范圍是 [0,1];esp 為補償系數;γ 則為伽瑪系數

與對數變換不同,伽瑪變換可以根據 γ 的不同取值選擇性增強低灰度區域的對比度或是高灰度區域的對比度

γ 是影像灰度校正中非常重要的一個引數,其取值決定了輸入影像和輸出影像之間的灰度映射方式,即決定了是增強灰度值(陰影區域)還是增強高灰度(高亮區域),

  • γ > 1 時,影像的高灰度區域對比度得到增強;
  • γ < 1 時,影像的低灰度區域對比度得到增強;
  • γ = 1 時,這一灰度變換是線性的,即不改變原影像,

在進行變換時,我們通常將 0~255 的灰度動態范圍首先變換到 0~1 的動態范圍,執行伽瑪變換后再恢復原動態范圍

在這里插入圖片描述

4.2、Matlab 實作

Matlab 中為我們提供了實作灰度變換的基本工具 imadjust,其呼叫方式如下:

J = imadjust(I,[low_in high_in],[low_out high_out],gamma);

該函式將輸入影像 I 中從 low_in 至 high_in 之間的映射到輸出影像 J 的 low_out 和 high_out 之間的值,其余的值將被裁掉,

引數說明:

  • [low_in high_in] 和 [low_out high_out]:確定源灰度范圍到目標灰度范圍的映射,需要按照 double 型別給定,即取值范圍在 0~1 之間;

    空([])相當于默認值([0 1]),若 high_out 小于 low_out,則輸出影像 J 的亮度將會反轉,

  • 引數 gamma 指定了變換曲線的形狀,其默認值為 1,表示線性映射,若 gamma < 1,則映射被加權至最高的輸出值;若 gamma > 1,則映射被加權至最低的輸出值,

% 當 gamma 分別取不同值時的伽瑪變換效果
I = imread('pout.jpeg');

% Gamma 取 0.75
subplot(2,3,1);
imshow(imadjust(I,[],[],0.75));
title('Gamma 0.75');

% Gamma 取 1
subplot(2,3,2);
imshow(imadjust(I,[],[],1));
title('Gamma 1');

% Gamma 取 1.5
subplot(2,3,3);
imshow(imadjust(I,[],[],1.5));
title('Gamma 1.5');

% Gamma 取 0.75 的灰度直方圖
subplot(2,3,4);
imhist(imadjust(I,[],[],0.75));
title('Gamma 0.75');

% Gamma 取 1 的灰度直方圖
subplot(2,3,5);
imhist(imadjust(I,[],[],1));
title('Gamma 1');

% Gamma 取 1.5 的灰度直方圖
subplot(2,3,6);
imhist(imadjust(I,[],[],1.5));
title('Gamma 1.5');

結果:

在這里插入圖片描述


5、灰度閾值變換

灰度閾值變換可以將一幅灰度影像轉換成黑白的二值影像,

5.1、理論基礎

灰度閾值變換的函式運算式如下:
f ( x ) = { 0 x < T 255 x ≥ T f(x)=\begin{cases}0 & x < T \\ 255 &x ≥ T \end{cases} f(x)={0255?x<TxT?

5.2、Matlab 實作

Matlab 中和閾值變換有關的函式主要有兩個——im2bw 和 graythresh,

  1. 函式 im2bw 可用于實作閾值變換,呼叫語法如下:

    BW = im2bw(I,level);
    

    引數說明:

    • 引數 level 給出了具體的變換閾值,它是一個 0~1 之間的雙精度浮點數,例如輸入影像灰度范圍為 0~255 之間的 unit8 影像,如果 level = 0…5,則對應于分割閾值為 128,
  2. 函式 graythresh 可以自適應地確定變換所用的 “最優” 閾值,呼叫方式如下:

    thresh = graythresh(I)
    

下面的程式顯示了如何利用 graythresh 函式獲得的閾值和自行設定閾值進行閾值變換:

% 閾值變換
I = imread('pout.jpeg');
thresh = graythresh(I)     % 自適應確定閾值
thresh =

    0.4706
bw1 = im2bw(I,thresh);      % 二值化

bw2 = im2bw(I,130/255);     %130 為閾值實作二值化,注意將此閾值轉換至 [0,1] 之間
subplot(1,3,1);imshow(I);title('原影像');
subplot(1,3,2);imshow(bw1);title('自動選擇閾值');
subplot(1,3,3);imshow(bw2);title('閾值 130');

在這里插入圖片描述


6、分段線性變換

6.1、理論基礎

利用分段線性變換函式來增強影像對比度的方法實際是增強原圖各部分的反差,即增強輸入影像中感興趣的灰度區域,相對抑制那些不感興趣的灰度區域,分段線性函式的主要優勢在于它的形式可任意給出,而缺點是需要更多的用戶輸入,

分段線性變換的函式形式如下:
f ( x ) = { y 1 x 1 x x < x 1 y 2 ? y 1 x 2 ? x 1 ( x ? x 1 ) + y 1 x 1 ≤ x ≤ x 2 255 ? y 2 255 ? x 2 ( x ? x 2 ) + y 2 x > x 2 f(x)=\begin{cases} \frac{y_1}{x_1}x & x < x_1 \\ \frac{y_2 - y_1}{x_2 - x_1}(x-x_1)+y_1 & x_1 \leq x \leq x_2 \\ \frac{255-y_2}{255-x_2}(x-x_2)+y_2 & x > x_2 \end{cases} f(x)=??????x1?y1??xx2??x1?y2??y1??(x?x1?)+y1?255?x2?255?y2??(x?x2?)+y2??x<x1?x1?xx2?x>x2??


7、直方圖均衡化

7.1、理論基礎

直方圖均衡化又稱為灰度均衡化,是指通過某種灰度映射使輸入影像轉換為在每一灰度級上都有近似相同的像素點數的輸出影像(輸出的直方圖是均勻的),

灰度均衡的轉換公式:
D B = f ( D A ) = D m a x ∫ 0 D A p D A ( μ ) d μ D_B=f(D_A)=D_{max}\int_{0}^{D_A}p_{D_A}(\mu)d\mu DB?=f(DA?)=Dmax?0DA??pDA??(μ)dμ
式中:DB 為轉換后的灰度值;DA 為轉換前的灰度值,

而對于離散灰度值,相應的轉換公式為:
D B = f ( D A ) = D m a x A 0 ∑ i = 0 D A H i D_B=f(D_A)=\frac{D_{max}}{A_0}\sum_{i=0}^{D_A}H_{i} DB?=f(DA?)=A0?Dmax??i=0DA??Hi?
式中:Hi 為第 i 級灰度的像素個數;A0 為影像的面積,即像素總數,

7.2、Matlab 實作

Matlab 影像處理工具提供了用于直方圖均衡化的函式 histeq,呼叫語法如下:

[J,T] = histeq(I)

引數說明:

  • J 為經過直方圖均衡化的輸出影像;
  • T 為變換矩陣,

影像易受光照、視角、方位、噪聲等的影響,在這些因素的作用下,同一類影像的不同變形體之間的差距有時大于該類影像與另一類影像之間的差距,這就給影像識別、分類帶來了困擾,影像歸一化就是將影像轉換成唯一的標準形式以抵抗各種變換,從而可消除同類影像不同變體之間的外觀差異

當影像歸一化用于消除灰度因素(光照等)造成的影像外觀變化時,稱為(影像)灰度歸一化,

% 讀入圖片,然后對其進行增加對比度、減小對比度、線性增加亮度和線性減少亮度的處理
% 接著又分別對這 4 幅影像進行了直方圖均衡化處理并顯示處理前后的直方圖

I = imread('pout.jpeg');
I = im2double(I);

% 對于對比度較大的影像
I1 = 2 * I - 55/255;
subplot(4,4,1);
imshow(I1);
subplot(4,4,2);
imhist(I1);
subplot(4,4,3);
imshow(histeq(I1));
subplot(4,4,4);
imhist(histeq(I1));

% 對于對比度變小的影像
I2 = 0.5 * I + 55/255;
subplot(4,4,5);
imshow(I2);
subplot(4,4,6);
imhist(I2);
subplot(4,4,7);
imshow(histeq(I2));
subplot(4,4,8);
imhist(histeq(I2));

% 對于線性增加亮度的影像
I3 = I + 55/255;
subplot(4,4,9);
imshow(I3);
subplot(4,4,10);
imhist(I3);
subplot(4,4,11);
imshow(histeq(I3));
subplot(4,4,12);
imhist(histeq(I3));

% 對于線性減小亮度的影像
I4 = I + 55/255;
subplot(4,4,13);
imshow(I4);
subplot(4,4,14);
imhist(I4);
subplot(4,4,15);
imshow(histeq(I4));
subplot(4,4,16);
imhist(histeq(I4));

在這里插入圖片描述


8、直方圖規定化

直方圖均衡化可以自動確定灰度變換函式,從而獲得具有均勻直方圖的輸出影像,它主要用于增強動態范圍偏小的影像對比度,豐富影像的灰度級,

但是有時候希望可以對變換程序加以控制,如能夠人為修正直方圖的形狀,或者說是獲得具有指定直方圖的輸出影像,這樣就可以有選擇地增強某個范圍內的對比度或使影像灰度值滿足某種特定的分布,稱為直方圖規定化,或直方圖匹配,

8.1、理論基礎

直方圖規定化是在運用均衡化原理的基礎上,通過建立原始影像和期望影像之間的關系,使原始影像的直方圖匹配特定的形狀,從而彌補直方圖不具備互動作用的特性,

其匹配原理是先對原始的影像均衡化:
s = f ( r ) = ∫ 0 r p r ( μ ) d μ s=f(r)=\int_0^rp_r(\mu)d\mu s=f(r)=0r?pr?(μ)dμ
同時對待匹配直方圖的影像進行均衡化處理:
v = g ( z ) = ∫ 0 z p z ( λ ) d λ V v=g(z)=\int_0^zp_z(\lambda)d\lambda V v=g(z)=0z?pz?(λ)dλV
由于都是均衡化,故可令 s = v,則:
v = g ? 1 ( s ) = g ? 1 ( f ( r ) ) v=g^{-1}(s)=g^{-1}(f(r)) v=g?1(s)=g?1(f(r))
于是,我們可以按照如下的步驟由輸入影像得到一個具有規定概率密度函式(PDF)的影像:

  1. 根據式 8 得到變換關系 f?;
  2. 根據式 9 得到變換關系 g(z);
  3. 求得反變換函式 g-1
  4. 對輸入影像所有像素應用式 10 的變換,從而得到輸出影像,

8.2、Matlab 實作

histeq 函式不僅可以用于直方圖均衡化,也可以用于直方圖規定化,此時需要提供可選引數 hgram:

[J,T] = histeq(I,hgram)

下面的例子實作了從影像 I 到影像 I1 和 I2 的直方圖匹配:

% 實作了從影像 I 到影像 I1 和 I2 的直方圖匹配
I = imread('pout.jpeg');    % 讀取原影像
I1 = imread('coins.jpg');  % 讀入要匹配直方圖的影像
I2 = imread('test.jpeg');   % 讀入要匹配直方圖的影像

% 計算直方圖
[hgram1,x] = imhist(I1);
[hgram2,x] = imhist(I2);

% 執行直方圖均衡化
J1 = histeq(I,hgram1);
J2 = histeq(I,hgram2);

% 繪圖
subplot(2,3,1);
imshow(I);title('原圖');
subplot(2,3,2);
imshow(I1);title('標準圖1');
subplot(2,3,3);
imshow(I2);title('標準圖2');
subplot(2,3,5);
imshow(J1);title('規劃到1');
subplot(2,3,6);
imshow(J2);title('規劃到2');

% 繪畫直方圖
figure;

subplot(2,3,1);
imhist(I); title('原圖');
subplot(2,3,2);
imhist(I1); title('標準圖1');
subplot(2,3,3);
imhist(I2);title('標準圖2');
subplot(2,3,5);
imhist(J1);title('規劃到1');
subplot(2,3,6);
imhist(J2);title('規劃到2');

在這里插入圖片描述
直方圖規定化本質上一種擬合程序,因此變換得到的直方圖與標準影像的直方圖并不會完全一致,然而即使只是相似的擬合,仍然使規定化的影像在亮度與對比度上具有類似標準影像的特性,這正是直方圖規定化的目的所在,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/203701.html

標籤:python

上一篇:IP網路攝像頭RTSP協議視頻平臺EasyNVR如何通過用戶權限設定給用戶屏蔽指定通道?

下一篇:git獲取大容量工程出錯:RPC failed; curl GnuTLS recv error : Decryption has failed.

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more