伽馬(gamma)變換記錄

? ? ? ? 此只記錄伽馬變換原理及其應用結果(文章所有內容基于數字圖像處理-岡薩雷斯),和直接用MATLAB代碼生成伽馬變換代碼。

一、原理

? ? ? ? 伽馬變換的公式很簡答? 就是一個有規律的冪運算 公式如下:

? ? ? ? 一般在圖像中進行應用是 C=1? y為不同值時r的輸出曲線,曲線如下:

二、應用場景

? ? ? ? 在圖像處理中 伽馬變換都是基于灰度圖像來的? 其應用的方式有兩種,如上圖的輸出曲線,第一種是增大灰度級,第二種是壓縮灰度級,其分界點是y==1。

? ? ? ? 2.1 增大灰度級

? ? ? ? 當圖整體比較暗,很難觀測到細節時,就需要增大灰度級,來增強對比度,讓圖像的細節更明顯,如下圖:

? ? ? ? 上圖中 第一幅圖是原圖,第二幅圖是y==0.6,第三幅圖是y==0.4,第四幅圖是y==0.3,由上圖觀察可以發現:

? ? ? ? 紅圈:當伽馬值從0.6降至04時,會出現更多的細節。將伽馬值進一步減小到0.3,會增強背景中的更多細節。

? ? ? ? 藍圈:當伽馬值==0.3時,開始具有輕微“蒼白”外觀(尤其是在背景中)的圖像相比,對比度開始下降。y=0.4時,對比度和可分辨細節的增強效果最好。y=0.3是一個近似的極限值,低于這個值時,這幅圖像的對比度會降低到不可接受的水平。

? ? ? ? 因此書中給予增強細節的最佳值應為y==0.4;

2.2 壓縮灰度級

????????當圖像比較亮,致使整個圖片呈現出蒼白的畫面時,就需要壓縮灰度級讓圖片更加清晰,以顯現出更多細節,如下圖:

????????上圖中 第一幅圖是原圖,第二幅圖是y==3,第三幅圖是y==4,第四幅圖是y==5,由上圖觀察可以發現,使用伽馬值3.0和 4.0得到了合適的結果。后一結果的外觀更吸引人,因為它的對比度更高。y= 5.0時的結果同樣如此。在d圖中,靠近圖像中間的機場跑道看起來要比其他三幅圖像更清晰,但是這個值并不是越大越好,而是有一個自己認為比較合適的值,這個需要自己去調試,個人一般用Y==4這個值,即不會很蒼白,細節同樣也具備。

三、MATLAB 代碼

? ? ? 用MATLAB 代碼來實現伽馬變換很簡單 ,就是做一個冪運算,做完運算后按照特定的方式創建一個verilog代碼,并將其輸出,就得到一個完整的verilog伽馬運算了。

% 伽馬變換參數
gamma_value = 0.4; % 固定伽馬值% 創建輸入值范圍 (0-255)
input_values = 0:255;% 應用伽馬變換公式: output = 255 * (input/255)^gamma
normalized_input = input_values / 255;
output_values = 255 * (normalized_input .^ gamma_value);% 將輸出值四舍五入到最接近的整數并限制在0-255范圍內
output_values = round(output_values);
output_values(output_values > 255) = 255;
output_values(output_values < 0) = 0;% 創建Verilog模塊代碼
verilog_module = 'module gamma (';
verilog_module = [verilog_module, sprintf('\n    input                               clk                        ,')];
verilog_module = [verilog_module, sprintf('\n    input                               pre_vsync                  ,')];
verilog_module = [verilog_module, sprintf('\n    input                               pre_href                   ,')];
verilog_module = [verilog_module, sprintf('\n    input              [   7:0]         pre_data                   ,')];
verilog_module = [verilog_module, sprintf('\n    output reg                          post_vsync                 ,')];
verilog_module = [verilog_module, sprintf('\n    output reg                          post_href                  ,')];
verilog_module = [verilog_module, sprintf('\n    output reg         [   7:0]         post_data                   ')];
verilog_module = [verilog_module, sprintf('\n);')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\nalways @(posedge clk) begin post_vsync<=pre_vsync; post_href<=pre_href;   end')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\nalways @(posedge clk) begin')];
verilog_module = [verilog_module, sprintf('\n    case (pre_data)')];% 添加所有case語句
for i = 0:255verilog_module = [verilog_module, sprintf('\n        8''d%d: post_data = 8''d%d;', i, output_values(i+1))];
end% 添加默認case和結束語句
verilog_module = [verilog_module, sprintf('\n        default: post_data = 8''d0;')];
verilog_module = [verilog_module, sprintf('\n    endcase')];
verilog_module = [verilog_module, sprintf('\nend')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\n')];
verilog_module = [verilog_module, sprintf('\nendmodule')];% 將Verilog模塊保存到文件
filename = 'C:\Users\17353\Desktop\gamma\gamma_lut.v';
fid = fopen(filename, 'w');
if fid == -1error('無法創建文件');
end% 直接寫入文件
fprintf(fid, '%s', verilog_module);
fclose(fid);disp(['伽馬變換模塊已保存到文件: ', filename]);
disp(['伽馬值: ', num2str(gamma_value)]);% 顯示部分查找表內容
disp('部分查找表示例:');
for i = [0, 64, 128, 192, 255]fprintf('輸入: %3d -> 輸出: %3d\n', i, output_values(i+1));
end

四、MATLAB 生成的verilog 代碼

module gamma_lut (input                               clk                        ,input                               pre_vsync                  ,input                               pre_href                   ,input              [   7:0]         pre_data                   ,output reg                          post_vsync                 ,output reg                          post_href                  ,output reg         [   7:0]         post_data                   
);always @(posedge clk) begin post_vsync<=pre_vsync; post_href<=pre_href;   endalways @(posedge clk) begincase (pre_data)8'd0: post_data = 8'd0;8'd1: post_data = 8'd28;8'd2: post_data = 8'd37;8'd3: post_data = 8'd43;8'd4: post_data = 8'd48;8'd5: post_data = 8'd53;8'd6: post_data = 8'd57;8'd7: post_data = 8'd61;8'd8: post_data = 8'd64;8'd9: post_data = 8'd67;8'd10: post_data = 8'd70;8'd11: post_data = 8'd73;8'd12: post_data = 8'd75;8'd13: post_data = 8'd78;8'd14: post_data = 8'd80;8'd15: post_data = 8'd82;8'd16: post_data = 8'd84;8'd17: post_data = 8'd86;8'd18: post_data = 8'd88;8'd19: post_data = 8'd90;8'd20: post_data = 8'd92;8'd21: post_data = 8'd94;8'd22: post_data = 8'd96;8'd23: post_data = 8'd97;8'd24: post_data = 8'd99;8'd25: post_data = 8'd101;8'd26: post_data = 8'd102;8'd27: post_data = 8'd104;8'd28: post_data = 8'd105;8'd29: post_data = 8'd107;8'd30: post_data = 8'd108;8'd31: post_data = 8'd110;8'd32: post_data = 8'd111;8'd33: post_data = 8'd113;8'd34: post_data = 8'd114;8'd35: post_data = 8'd115;8'd36: post_data = 8'd117;8'd37: post_data = 8'd118;8'd38: post_data = 8'd119;8'd39: post_data = 8'd120;8'd40: post_data = 8'd122;8'd41: post_data = 8'd123;8'd42: post_data = 8'd124;8'd43: post_data = 8'd125;8'd44: post_data = 8'd126;8'd45: post_data = 8'd127;8'd46: post_data = 8'd129;8'd47: post_data = 8'd130;8'd48: post_data = 8'd131;8'd49: post_data = 8'd132;8'd50: post_data = 8'd133;8'd51: post_data = 8'd134;8'd52: post_data = 8'd135;8'd53: post_data = 8'd136;8'd54: post_data = 8'd137;8'd55: post_data = 8'd138;8'd56: post_data = 8'd139;8'd57: post_data = 8'd140;8'd58: post_data = 8'd141;8'd59: post_data = 8'd142;8'd60: post_data = 8'd143;8'd61: post_data = 8'd144;8'd62: post_data = 8'd145;8'd63: post_data = 8'd146;8'd64: post_data = 8'd147;8'd65: post_data = 8'd148;8'd66: post_data = 8'd149;8'd67: post_data = 8'd149;8'd68: post_data = 8'd150;8'd69: post_data = 8'd151;8'd70: post_data = 8'd152;8'd71: post_data = 8'd153;8'd72: post_data = 8'd154;8'd73: post_data = 8'd155;8'd74: post_data = 8'd155;8'd75: post_data = 8'd156;8'd76: post_data = 8'd157;8'd77: post_data = 8'd158;8'd78: post_data = 8'd159;8'd79: post_data = 8'd160;8'd80: post_data = 8'd160;8'd81: post_data = 8'd161;8'd82: post_data = 8'd162;8'd83: post_data = 8'd163;8'd84: post_data = 8'd164;8'd85: post_data = 8'd164;8'd86: post_data = 8'd165;8'd87: post_data = 8'd166;8'd88: post_data = 8'd167;8'd89: post_data = 8'd167;8'd90: post_data = 8'd168;8'd91: post_data = 8'd169;8'd92: post_data = 8'd170;8'd93: post_data = 8'd170;8'd94: post_data = 8'd171;8'd95: post_data = 8'd172;8'd96: post_data = 8'd173;8'd97: post_data = 8'd173;8'd98: post_data = 8'd174;8'd99: post_data = 8'd175;8'd100: post_data = 8'd175;8'd101: post_data = 8'd176;8'd102: post_data = 8'd177;8'd103: post_data = 8'd177;8'd104: post_data = 8'd178;8'd105: post_data = 8'd179;8'd106: post_data = 8'd179;8'd107: post_data = 8'd180;8'd108: post_data = 8'd181;8'd109: post_data = 8'd182;8'd110: post_data = 8'd182;8'd111: post_data = 8'd183;8'd112: post_data = 8'd183;8'd113: post_data = 8'd184;8'd114: post_data = 8'd185;8'd115: post_data = 8'd185;8'd116: post_data = 8'd186;8'd117: post_data = 8'd187;8'd118: post_data = 8'd187;8'd119: post_data = 8'd188;8'd120: post_data = 8'd189;8'd121: post_data = 8'd189;8'd122: post_data = 8'd190;8'd123: post_data = 8'd190;8'd124: post_data = 8'd191;8'd125: post_data = 8'd192;8'd126: post_data = 8'd192;8'd127: post_data = 8'd193;8'd128: post_data = 8'd194;8'd129: post_data = 8'd194;8'd130: post_data = 8'd195;8'd131: post_data = 8'd195;8'd132: post_data = 8'd196;8'd133: post_data = 8'd197;8'd134: post_data = 8'd197;8'd135: post_data = 8'd198;8'd136: post_data = 8'd198;8'd137: post_data = 8'd199;8'd138: post_data = 8'd199;8'd139: post_data = 8'd200;8'd140: post_data = 8'd201;8'd141: post_data = 8'd201;8'd142: post_data = 8'd202;8'd143: post_data = 8'd202;8'd144: post_data = 8'd203;8'd145: post_data = 8'd203;8'd146: post_data = 8'd204;8'd147: post_data = 8'd205;8'd148: post_data = 8'd205;8'd149: post_data = 8'd206;8'd150: post_data = 8'd206;8'd151: post_data = 8'd207;8'd152: post_data = 8'd207;8'd153: post_data = 8'd208;8'd154: post_data = 8'd208;8'd155: post_data = 8'd209;8'd156: post_data = 8'd209;8'd157: post_data = 8'd210;8'd158: post_data = 8'd211;8'd159: post_data = 8'd211;8'd160: post_data = 8'd212;8'd161: post_data = 8'd212;8'd162: post_data = 8'd213;8'd163: post_data = 8'd213;8'd164: post_data = 8'd214;8'd165: post_data = 8'd214;8'd166: post_data = 8'd215;8'd167: post_data = 8'd215;8'd168: post_data = 8'd216;8'd169: post_data = 8'd216;8'd170: post_data = 8'd217;8'd171: post_data = 8'd217;8'd172: post_data = 8'd218;8'd173: post_data = 8'd218;8'd174: post_data = 8'd219;8'd175: post_data = 8'd219;8'd176: post_data = 8'd220;8'd177: post_data = 8'd220;8'd178: post_data = 8'd221;8'd179: post_data = 8'd221;8'd180: post_data = 8'd222;8'd181: post_data = 8'd222;8'd182: post_data = 8'd223;8'd183: post_data = 8'd223;8'd184: post_data = 8'd224;8'd185: post_data = 8'd224;8'd186: post_data = 8'd225;8'd187: post_data = 8'd225;8'd188: post_data = 8'd226;8'd189: post_data = 8'd226;8'd190: post_data = 8'd227;8'd191: post_data = 8'd227;8'd192: post_data = 8'd228;8'd193: post_data = 8'd228;8'd194: post_data = 8'd229;8'd195: post_data = 8'd229;8'd196: post_data = 8'd230;8'd197: post_data = 8'd230;8'd198: post_data = 8'd230;8'd199: post_data = 8'd231;8'd200: post_data = 8'd231;8'd201: post_data = 8'd232;8'd202: post_data = 8'd232;8'd203: post_data = 8'd233;8'd204: post_data = 8'd233;8'd205: post_data = 8'd234;8'd206: post_data = 8'd234;8'd207: post_data = 8'd235;8'd208: post_data = 8'd235;8'd209: post_data = 8'd235;8'd210: post_data = 8'd236;8'd211: post_data = 8'd236;8'd212: post_data = 8'd237;8'd213: post_data = 8'd237;8'd214: post_data = 8'd238;8'd215: post_data = 8'd238;8'd216: post_data = 8'd239;8'd217: post_data = 8'd239;8'd218: post_data = 8'd240;8'd219: post_data = 8'd240;8'd220: post_data = 8'd240;8'd221: post_data = 8'd241;8'd222: post_data = 8'd241;8'd223: post_data = 8'd242;8'd224: post_data = 8'd242;8'd225: post_data = 8'd243;8'd226: post_data = 8'd243;8'd227: post_data = 8'd243;8'd228: post_data = 8'd244;8'd229: post_data = 8'd244;8'd230: post_data = 8'd245;8'd231: post_data = 8'd245;8'd232: post_data = 8'd246;8'd233: post_data = 8'd246;8'd234: post_data = 8'd246;8'd235: post_data = 8'd247;8'd236: post_data = 8'd247;8'd237: post_data = 8'd248;8'd238: post_data = 8'd248;8'd239: post_data = 8'd248;8'd240: post_data = 8'd249;8'd241: post_data = 8'd249;8'd242: post_data = 8'd250;8'd243: post_data = 8'd250;8'd244: post_data = 8'd251;8'd245: post_data = 8'd251;8'd246: post_data = 8'd251;8'd247: post_data = 8'd252;8'd248: post_data = 8'd252;8'd249: post_data = 8'd253;8'd250: post_data = 8'd253;8'd251: post_data = 8'd253;8'd252: post_data = 8'd254;8'd253: post_data = 8'd254;8'd254: post_data = 8'd255;8'd255: post_data = 8'd255;default: post_data = 8'd0;endcase
endendmodule

? ? ? ? 這里采用的是Y==0.4 的伽馬曲線,想要什么曲線可以直接在MATLAB中調整即可,直接全自動無需寫代碼。

? ? ? ?

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

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

相關文章

電路學習(六)三極管

三極管是一種電流驅動元器件&#xff08;MOS管為電壓驅動&#xff09;&#xff0c;在電路中可以充當開關&#xff0c;放大電流等作用。本文章參考了尚硅谷的視頻資料。1. 什么是三極管&#xff1f;三極管又被稱為晶體三極管&#xff08;Bipolar Junction Transistor&#xff0c…

配置docker常見問題

輸入sudo yum install -y yum-utils device-mapper-persistent-data lvm2出現Cannot find a valid baseurl for repo: base/7/x86_64一、檢查網絡輸入ping www.baidu.com出現PING www.a.shifen.com (220.181.111.1) 56(84) bytes of data. 64 bytes from 220.181.111.1 (220.18…

Python 實戰:票據圖像自動矯正技術拆解與落地教程

在日常辦公自動化&#xff08;OA&#xff09;或財務數字化場景中&#xff0c;拍攝的票據常因角度問題出現傾斜、變形&#xff0c;不僅影響視覺呈現&#xff0c;更會導致 OCR 文字識別準確率大幅下降。本文將從技術原理到代碼實現&#xff0c;手把手教你用 Python 打造票據圖像自…

vue3+TS項目配置unocss

配置unocss &#xff08;1&#xff09;安裝依賴 npm i unocss unocss/preset-uno unocss/preset-attributify -D npm install unocss/transformer-directives&#xff08;2&#xff09;根目錄新建uno.config.ts文件 import { defineConfig } from "unocss"; impor…

嵌入式硬件工程師的每日提問

一、LDO與DC-DC的對比1&#xff09;同&#xff1a;兩者都是將不穩定的直流輸入電壓轉換為穩定的直流輸出電壓。2&#xff09;異&#xff1a;LDO&#xff1a;線性調節&#xff0c;通過內部功率晶體管&#xff0c;工作在線性區&#xff0c;穩定輸出電壓。類比&#xff1a;將湍急的…

從零到一使用Linux+Nginx+MySQL+PHP搭建的Web網站服務器架構環境——LNMP(下)

從零到一使用LinuxNginxMySQLPHP搭建的Web網站服務器架構環境——LNMP&#xff08;上&#xff09;https://coffeemilk.blog.csdn.net/article/details/151350565 一、Nginx與PHP-FPM整合原理 1.1、PHP-FPM配置文件 Nginx與PHP-FPM整合原理序號說明1 PHP-FPM是一個第三方的Fast…

論文閱讀-Correlate and Excite

文章目錄1 背景2 創新點3 方法3.1 總體結構3.2 代價體計算3.3 引導式代價體激勵&#xff08;GCE&#xff09;3.4 TopK視差回歸4 效果參考資料1 背景 在IGEV中構建幾何編碼體CGC_GCG?時用到了本文將要描述的CoEx&#xff0c;IGEV中沒有說明為什么要這樣做&#xff0c;本文就是…

探索大語言模型(LLM):Open-WebUI的安裝

前言 Open-WebUI 是一款專為大模型設計的開源可視化交互工具&#xff0c;它通過類 ChatGPT 的直觀界面&#xff0c;讓用戶無需代碼即可管理、調試和調用本地或云端的大語言模型&#xff08;LLMs&#xff09;&#xff0c;成為私有化部署的便捷工具&#xff0c;本文將介紹如何部…

企業遠程訪問方案選擇:何時選內網穿透,何時需要反向代理?

企業遠程訪問需求日益增長&#xff0c;無論是遠程辦公、分支互聯還是服務發布&#xff0c;選擇合適的網絡方案都至關重要。內網穿透和反向代理是兩種常見的技術手段&#xff0c;但它們的設計目標和適用場景截然不同。本文將客觀分析兩者的特點&#xff0c;幫助企業做出更合理的…

ARM指令集(Instruction Set)細節

ARM指令集(Instruction Set)細節 本文旨在深入探討 ARM 指令集(Instruction Set)的細節。這是一個非常廣泛的主題&#xff0c;我會將其分解為關鍵概念、不同版本的區別以及核心特性&#xff0c;并提供一些示例。 ARM 指令集的核心在于 RISC&#xff08;精簡指令集計算機&#x…

Vue基礎知識-Vue集成 Element UI全量引入與按需引入

一、方式一&#xff1a;全量引入 Element UI全量引入即一次性加載 Element UI 所有組件和樣式&#xff0c;優點是配置簡單&#xff0c;適合快速開發&#xff1b;缺點是打包體積較大&#xff0c;生產環境可能存在冗余。1. 安裝 Element UI全量引入只需安裝 Element UI 核心依賴&…

leetcode26(字母異位詞分組)

給你一個字符串數組&#xff0c;請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。示例 1:輸入: strs ["eat", "tea", "tan", "ate", "nat", "bat"]輸出: [["bat"],["nat","…

光平面標定 (Laser Plane Calibration) 的原理和流程

光平面標定 (Laser Plane Calibration) 是線激光3D相機系統中最為關鍵且精巧的一步,它直接決定了最終的測量精度。 核心目標 光平面標定的目標是:精確地求出激光器發射出的那個扇形激光平面,在相機坐標系下的數學方程。 這個方程通常表示為一般式: Ax + By + Cz + D = 0…

項目1——單片機程序審查,控制系統項目評估總結報告

執行摘要 本報告對基于STM32F103RET6的老虎機控制系統進行了全面的技術評估。通過深入分析代碼結構、系統架構、安全機制和潛在風險&#xff0c;為項目的進一步開發和部署提供專業建議。 核心發現 ? 系統架構: 設計合理&#xff0c;模塊化程度高?? 安全性: 存在輸入驗證和并…

【Qt應用程序】

Qt應用程序摘要概述快速開始Qt在線下載與安裝Visual Studio開發Qt項目VS配置Qt擴展VS創建Qt項目配置qDebug調試信息配置源程序的字符集項目結構對象樹與內存回收基礎數據類型信號槽定時器窗口QWidgetQMainWindowQDialog窗口布局窗口中添加右鍵菜單控件按鈕類容器類自定義控件事…

機器學習實戰(一): 什么是機器學習

機器學習&#xff1a;讓機器學會思考的魔法前言 在當今數字化的浪潮中&#xff0c;人工智能無疑是最引人注目的技術之一&#xff0c;而機器學習正是其核心驅動力。它不再是科幻電影中的遙遠設想&#xff0c;而是已經滲透到我們日常生活的方方面面&#xff0c;從智能推薦到自動駕…

java流水號生成方式

1、基于時間戳生成流水號利用當前時間戳生成流水號&#xff0c;可以確保唯一性。通過格式化時間戳&#xff0c;可以生成固定位數的流水號。SimpleDateFormat sdf new SimpleDateFormat("yyyyMMddHHmmssSSS"); String serialNumber sdf.format(new Date());特點&…

前端工具大全:前端開發工具、前端調試工具、前端性能優化工具與構建工具的對比與最佳實踐

在現代前端開發中&#xff0c;工具鏈已經成為開發效率與代碼質量的關鍵。無論是 編輯器與 IDE、構建與打包工具、調試工具 還是 性能優化工具&#xff0c;每一個環節都有成熟的解決方案。 然而&#xff0c;工具太多也容易讓團隊選擇困難&#xff1a;該選 VS Code 還是 WebStorm…

ABAP 使用ECHARTS實現圖表展示

最近發現ECHARTS可以整合到SAP中的開源項目&#xff0c;可以絲滑的在SAP中展示各種圖表&#xff0c;還是相當驚艷的。 ECHARTS官方網站&#xff1a;https://echarts.apache.org/examples/zh/index.html 今天順手在開發環境成功安裝了&#xff0c;做下記錄&#xff1a; 1、ABA…

hot100-貪心算法(附圖解思路)

貪心算法的核心&#xff0c;就是用局部最優去代替全局最優。一般的步驟就是去試思路&#xff0c;然后舉反例&#xff0c;如果舉不出反例&#xff0c;基本可以看作是正確的方法。121. 買賣股票的最佳時機&#xff08;Best Time to Buy and Sell Stock&#xff09;難度&#xff1…