影樓精修-膚色統一算法解析

注意:本文樣例圖片為了避免侵權,均使用AIGC生成;

本文介紹影樓精修中膚色統一算法的實現方案,并以像素蛋糕為例,進行分析說明。

膚色統一就是將人像照片中皮膚區域的顏色進行統一,看起來顏色均勻一致,不會出現顏色不均勻問題。我們以像素蛋糕軟件為例,示例圖如下:

可以看到,在對人臉和身體進行膚色統一之后,皮膚的顏色一致性變好了不少,給人主觀感受更佳。

像素蛋糕的膚色統一功能歷經了多個版本的迭代,目前包含AI膚色統一和膚色統一兩個版本,同時又將人臉和身體區域做了區分,得到了臉部區域膚色統一和身體區域膚色統一功能調節,從用戶或者設計師角度來講,可控性更強,同時支持了單人和多人的處理。

膚色統一和AI膚色統一功能的差異:可能是AI膚色統一使用了基于深度學習的模型方案,直接自動對皮膚顏色和亮度進行調節,而膚色統一則是基于傳統圖像處理方案構建的;

我們這里以傳統膚色統一為例進行說明。通過效果上的測試,將像素蛋糕的膚色統一特點總結如下:

1.皮膚區域顏色一致性提高,顏色向某個顏色靠攏,而且,這個顏色并非皮膚區域的顏色均值,而是亮度較高的顏色;

2.皮膚暗部區域的亮度會自動調整變亮;

3.人臉和皮膚區域可分開處理;

我們將按照這三個特點來進行實現;

算法方案

假設原圖為S,最終效果圖為D;

1.對S進行皮膚分割,獲得皮膚區域Mask圖Mask_skin,這一步需要較高的準確性,皮膚區域為1-255的灰度值,非皮膚區域為0;目前皮膚分割相對比較準確的圖片API,如:美圖皮膚分割API > 阿里云皮膚分割API;

美圖API:https://ai.meitu.com/index?t=1747366168417

阿里云API:https://vision.aliyun.com/experience/detail?tagName=imageseg&children=SegmentSkin

2.對S進行人臉點位檢測,根據人臉關鍵點,計算人臉區域Mask圖Mask_face;

3.將膚色統一劃分為皮膚區域亮度統一和顏色統一兩個模塊;

3.1亮度統一,以身體皮膚區域處理為例,對皮膚區域進行基于直方圖信息的暗部區域自動亮度矯正;

思路:統計皮膚區域亮度直方圖,計算亮度中值,統計亮度低于中值的暗部區域皮膚像素數量,用于動態計算亮度增強程度,根據亮度增強程度,對暗部區域亮度進行矯正,非暗部區域保持不變;

這里給出亮度統一的核心代碼:

void SkinBrightenWithHistogram(unsigned char* bgraData, int width, int height, int stride, unsigned char* skinMask) {int size = width * height;float* luminance = (float*)malloc(sizeof(float) * size);int histBins[256] = { 0 };int skinCount = 0;// 1. 提取亮度信息并構建直方圖for (int y = 0; y < height; ++y) {unsigned char* row = bgraData + y * stride;for (int x = 0; x < width; ++x, row += 4) {int idx = y * width + x;float r = row[2], g = row[1], b = row[0];float yVal = 0.299f * r + 0.587f * g + 0.114f * b;luminance[idx] = yVal;if (skinMask[idx] > 20) {int bin = (int)CLIP3(yVal, 0, 255);histBins[bin]++;skinCount++;}}}if (skinCount == 0) {free(luminance);return;}// 2. 使用直方圖累加計算中值亮度int medianIndex = skinCount / 2;int cumulative = 0;int medianBin = 0;for (int i = 0; i < 256; ++i) {cumulative += histBins[i];if (cumulative >= medianIndex) {medianBin = i;break;}}float medianY = (float)medianBin;// 3. 統計暗部像素數量(亮度 < 中值)int darkCount = 0;for (int i = 0; i < medianBin; ++i) {darkCount += histBins[i];}float darkRatio = (float)darkCount / skinCount;4. 根據暗部比例動態計算增強強度 alpha//float alpha = CLAMP(0.3f + darkRatio * 0.7f, 0.3f, 1.0f);//if (medianY < 80.0f) {//        alpha *= 1.2f;//}//float gamma = 1.2f;// 5. 根據暗部比例動態計算增強強度 alpha(提高提亮效果)float alpha = CLIP3(0.4f + darkRatio * 1.0f, 0.4f, 1.2f);  // 強化基礎 alphaif (medianY < 80.0f) {alpha *= 1.4f;  // 放大提亮倍數}else if (medianY < 100.0f) {alpha *= 1.2f;  // 中等放大}float gamma = 1.4f;  // 增加 gamma(讓暗部提亮更明顯)// 6. 提亮暗部區域for (int y = 0; y < height; ++y) {unsigned char* row = bgraData + y * stride;for (int x = 0; x < width; ++x, row += 4) {int idx = y * width + x;if (skinMask[idx] < 5) continue;float Y = luminance[idx];if (Y < medianY) {float norm = CLIP3(1.0f - (Y / (medianY + 1e-5f)), 0.0f, 1.0f);float boost = alpha * powf(norm, gamma);float newY = CLIP3(Y + boost * medianY, 0, 255);float scale = newY / (Y + 1e-5f);int gray = row[1] * skinMask[idx] / 255;  // 用綠色通道估算灰度用于保色插值for (int c = 0; c < 3; ++c) {float val = row[2 - c] * scale;val = (unsigned char)CLIP3(val, 0, 255);row[2 - c] = (val * gray + row[2 - c] * (255 - gray)) / 255;}}}}free(luminance);
}

3.2顏色統一,基于HSV或Lab顏色空間,計算皮膚區域顏色亮度直方圖統計的中值以上的皮膚像素RGB均值,映射到HSV或Lab顏色空間,得到對應H或ab的均值(也可直接統計H或ab的均值);以HSV為例,根據原圖皮膚像素的HSV和目標均值HSV,重新映射得到顏色統一為均值顏色后的HSV,然后映射到RGB;

HSV_result=(H_mean, S_src,V_src)

RGB_result=HSV_result---->RGB

4.使用3的方式,分別對人臉區域和身體皮膚區域進行膚色統一,分別得到效果圖D_face和D_body;

5.設置人臉區域膚色統一參數k_face,身體膚色統一參數k_body,范圍[0,100],將原圖S和D_face,D_body進行alpha blend,得到最終效果圖D;

上述算法流程就是本人基于傳統數字圖像處理算法構建的膚色統一算法,效果測試和對比如下:

通過測試效果對比,可以看到,對比原圖S,本文算法在脖子等暗部區域亮度有一定的自動校正,同時,人臉和身體皮膚區域的膚色區域一致,基本實現了像素蛋糕類似的功能;

對于AI膚色統一,效果上會比傳統方法更自然,同時,對于暗部的亮度矯正也會更準確,后續將陸續進行分析;

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

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

相關文章

計算機網絡:什么是計算機網絡?它的定義和組成是什么?

計算機網絡是指通過通信設備和傳輸介質&#xff0c;將分布在不同地理位置的計算機、終端設備及其他網絡設備連接起來&#xff0c;實現資源共享、數據傳輸和協同工作的系統。其核心目標是使設備之間能夠高效、可靠地交換信息。 關鍵組成部分 硬件設備 終端設備&#xff1a;如計算…

深度學習---獲取模型中間層輸出的意義

一、什么是 Hook&#xff08;鉤子函數&#xff09;&#xff1f; 在 PyTorch 中&#xff0c;Hook 是一種機制&#xff0c;允許我們在模型的前向傳播或反向傳播過程中&#xff0c;插入自定義的函數&#xff0c;用來觀察或修改中間數據。 最常用的 hook 是 forward hook&#xf…

存儲器上如何存儲1和0

在計算機存儲器中&#xff0c;數據最終以**二進制形式&#xff08;0和1&#xff09;**存儲&#xff0c;這是由硬件特性和電子電路的物理特性決定的。以下是具體存儲方式的詳細解析&#xff1a; 一、存儲的物理基礎&#xff1a;半導體電路與電平信號 計算機存儲器&#xff08;…

Qt中的RCC

Qt資源系統(Qt resource system)是一種獨立于平臺的機制&#xff0c;用于在應用程序中傳輸資源文件。如果你的應用程序始終需要一組特定的文件(例如圖標、翻譯文件和圖片)&#xff0c;并且你不想使用特定于系統的方式來打包和定位這些資源&#xff0c;則可以使用Qt資源系統。 最…

2918. 數組的最小相等和

2918. 數組的最小相等和 題目鏈接&#xff1a;2918. 數組的最小相等和 代碼如下&#xff1a; class Solution { public:long long minSum(vector<int>& nums1, vector<int>& nums2) {auto [sum1, zero1] calc(nums1);auto [sum2, zero2] calc(nums2);i…

使用 Docker 部署 OnlyOffice

使用 Docker 部署 OnlyOffice 在如今容器化技術盛行的時代&#xff0c;Docker 已成為應用快速部署和隔離的最佳選擇。OnlyOffice 作為一款功能強大的在線辦公套件&#xff0c;通過 Docker 部署不僅能夠簡化安裝和維護流程&#xff0c;還能在不同環境中保持一致性&#xff0c;極…

DDD領域驅動介紹

&#x1f4d5;我是廖志偉&#xff0c;一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》&#xff08;基礎篇&#xff09;、&#xff08;進階篇&#xff09;、&#xff08;架構篇&#xff09;清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

前端 CSS 樣式書寫與選擇器 基礎知識

1.CSS介紹 CSS是Cascading Style Sheet的縮寫&#xff0c;中文意思為"層疊樣式表"&#xff0c;它是網頁的裝飾者&#xff0c;用來修飾各標簽 排版(大小、邊距、背景、位置等)、改變字體的樣式(字體大小、字體顏色、對齊方式等)。 2.CSS書寫位置 2.1 樣式表特征 層…

鴻蒙 從打開一個新窗口到Stage模型的UIAbility組件

打開一個新的窗口 我們首先來實現如何在一個應用中打開一個新窗口&#xff0c;使用的模型是 Stage 模型 在項目文件里&#xff0c;新建一個 newWindow.ets 新文件 src/main/ets/pages/newWindow.ets newWindow.ets文件里面隨便寫點什么都行&#xff0c;這里是第一步創建的文件…

Linux的日志管理

日志管理服務rsyslogd 配置文件 | 日志類型 | 說明 | | -------------------- | ----------------------------------- | | auth | pam產生的日志 | | authpriv | ssh、ftp等…

【PhysUnits】4.1 類型級比特位實現解釋(boolean.rs)

一、源碼 該代碼實現了一個類型級(type-level)的布爾系統&#xff0c;允許在編譯時進行布爾運算。 //! 類型級比特位實現 //! //! 這些是基礎的比特位類型&#xff0c;作為本庫中其他數值類型的構建基礎 //! //! 已實現的**類型運算符**&#xff1a; //! //! - 來自 core::op…

【docker】--數據卷掛載

文章目錄 存儲卷管理創建存儲卷查看存儲卷詳細信息查看存儲卷刪除存儲卷 存儲卷管理 # 目錄掛載 docker run -v 本機目錄&#xff1a;容器目錄#1&#xff09; # 將容器內部的 “/usr/share/nginx/html” 進行持久化掛載 會在宿主機生成一個隨機的存儲卷 docker run -v /usr/sh…

雙重差分模型學習筆記2(理論)

【DID最全總結】90分鐘帶你速通雙重差分&#xff01;_嗶哩嗶哩_bilibili 目錄 一、staggered DID 交錯雙重差分 二、動態雙重差分 動態雙重差分法公式解釋 符號解釋 公式邏輯與案例 與標準DID的區別 總結 “雙減” 政策動態差分模型 &#xff08;一&#xff09;設定處…

預測模型開發與評估:基于機器學習的數據分析實踐

在當今數據驅動的時代&#xff0c;預測模型已成為各行各業決策制定的核心工具。本文將分享我在COMP5310課程項目中開發預測模型的經驗&#xff0c;探討從數據清洗到模型優化的完整過程&#xff0c;并提供詳細的技術實現代碼。 ## 研究問題與數據集 ### 研究問題 我們的研究聚焦…

Java 并發編程歸納總結(可重入鎖 | JMM | synchronized 實現原理)

1、鎖的可重入 一個不可重入的鎖&#xff0c;搶占該鎖的方法遞歸調用自己&#xff0c;或者兩個持有該鎖的方法之間發生調用&#xff0c;都會發生死鎖。以之前實現的顯式獨占鎖為例&#xff0c;在遞歸調用時會發生死鎖&#xff1a; public class MyLock implements Lock {/* 僅…

數據治理域——數據同步設計

摘要 本文主要介紹了數據同步的多種方式&#xff0c;包括直連同步、數據文件同步和數據庫日志解析同步。每種方式都有其適用場景、技術特點、優缺點以及適用的數據類型和實時性要求。文章還詳細探討了數據直連同步的特點、工作原理、優點、缺點、適用場景等&#xff0c;并對數…

AI人工智能在教育領域的應用

AI人工智能在教育領域的應用 隨著科技的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;逐漸成為推動教育變革的重要力量。AI在教育領域的應用不僅改變了傳統的教學模式&#xff0c;還為個性化學習、教育資源優化和教育管理帶來了前所未有的機遇。本文將從多個方面探…

ohttps開啟群暉ssl證書自動更新

開啟群暉ssl證書自動更新OHTTPS ohttps是一個免費自動簽發ssl證書、管理、部署的項目。 https://ohttps.com 本文舉例以ohttps項目自動部署、更新群暉的ssl證書。 部署 簽發證書 打開ohttps-證書管理-創建證書-按你實際情況創建證書。創建部署節點 打開Ohttps-部署節點-添加…

ElasticSearch聚合操作案例

1、根據color分組統計銷售數量 只執行聚合分組&#xff0c;不做復雜的聚合統計。在ES中最基礎的聚合為terms&#xff0c;相當于 SQL中的count。 在ES中默認為分組數據做排序&#xff0c;使用的是doc_count數據執行降序排列。可以使用 _key元數據&#xff0c;根據分組后的字段數…

SQLite 數據庫常見問題及解決方法

一、數據庫文件鎖定問題 1. 問題表現 在多線程或多進程環境下訪問 SQLite 數據庫時&#xff0c;常常會出現數據庫文件被鎖定的情況。當一個進程對數據庫執行寫操作時&#xff0c;其他進程的讀寫操作都會被阻塞&#xff0c;導致應用程序出現卡頓甚至無響應。比如在移動應用開發…