日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用Python和OpenCV在图像之间执行超快速的颜色转换

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python和OpenCV在图像之间执行超快速的颜色转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Python和OpenCV在圖像之間執行超快速的顏色轉換

    • 1. 效果圖
    • 2. 原理
      • 2.1 顏色轉移算法
      • 2.2 步驟
      • 2.3 算法改進
    • 3. 源碼
    • 參考

這篇博客將介紹如何使用Python和OpenCV在圖像之間執行超快速的顏色轉換。
與Reinhard基于直方圖的顏色傳遞方法不同,該方法嚴格依賴Lab*顏色空間中像素強度的平均值和標準偏差,因此非常高效,能夠快速處理非常大的圖像。

1. 效果圖

如下圖所示,將左圖水母藍轉移到中間珊瑚紅上,得到轉換空間后的圖想藍紅珊瑚圖

效果圖2如下,將原圖珊瑚紅的色彩轉移到中間水母藍圖像上,得到右側的有點紫白蘭的水母圖

2. 原理

2.1 顏色轉移算法

有倆種方法可以實現顏色轉換:

  1. 基于直方圖的方法,該方法旨在平衡三種“類型”的垃圾箱:相等、過量和不足。
    該方法效果好,但以犧牲速度為代價。使用此算法需要對源圖像中的每個像素執行查找,這將隨著圖像大小的增長而變得非常昂貴。

  2. 顏色轉移算法——它只使用L * a * b 圖像通道的平均值和標準偏差。沒有復雜的代碼,沒有計算直方圖,只是簡單的統計數字。這種方法可以輕松地處理巨大的圖像。

通過分別利用Lab顏色空間和每個L、a和b通道的平均值和標準偏差,可以在兩幅圖像之間傳遞顏色。

2.2 步驟

  1. 輸入源圖像和目標圖像。源圖像包含希望目標圖像模擬的顏色空間。左側的日落圖像是我的源,中間的圖像是我的目標,右側的圖像是應用于目標的源的顏色空間。
  2. 將源圖像和目標圖像轉換為Lab顏色空間。**Lab顏色空間模擬感知一致性,其中顏色值的微小變化也應產生顏色重要性的相對相等變化。與標準RGB顏色空間相比,Lab*顏色空間在模擬人類如何解讀顏色方面做得更好,它在顏色傳遞方面非常有效。**
  3. 拆分源和目標的通道。
  4. 計算源圖像和目標圖像的每個Lab*通道的平均值和標準偏差。
  5. 從目標通道中減去目標圖像的Lab*通道的平均值。
  6. 通過目標的標準偏差除以源的標準偏差,再乘以目標通道,對目標通道進行縮放。
  7. 為源添加Lab*通道的方式。
  8. 剪裁范圍[0,255]之外的任何值(注意:此步驟不是原始文件的一部分。我添加它是因為OpenCV處理顏色空間轉換的方式。如果要在不同的語言/庫中實現此算法,則必須自己執行顏色空間轉換,或者了解庫如何進行轉換)。
  9. 將頻道重新合并在一起。
  10. 從Lab*空間轉換回RGB顏色空間。

2.3 算法改進

雖然Reinhard等人的算法速度極快,但有一個特別的缺點——它依賴于全局顏色統計,因此具有類似像素強度值的大區域會顯著影響平均值(從而影響整體顏色轉移)。

優化可以考慮兩種方案:

  1. 在較小的感興趣區域(ROI)中計算源圖像的平均值和標準偏差,ROI是希望模擬的顏色,而不是使用整個圖像。采用這種方法將使平均值和標準偏差更好地表示期望使用的顏色空間。

  2. 對兩幅圖像應用k均值聚類??梢栽贚ab*顏色空間中對每個圖像的像素強度進行聚類,然后使用歐幾里德距離確定兩個圖像之間最相似的質心。然后,只計算這些區域內的統計數據。同樣這將使平均值和標準差產生更“局部”的影響,并有助于緩解全局統計數據的過度代表性問題。 缺點是這種方法速度要慢得多。

3. 源碼

# USAGE
# python example.py --source images/sm.jpg --target images/sh.jpgimport argparseimport cv2
# 導入必要的類
from color_transfer import color_transferdef show_image(title, image, width=300):# 縮放照片為固定寬度像素,默認300像素r = width / float(image.shape[1])dim = (width, int(image.shape[0] * r))resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)# 展示縮放的照片cv2.imshow(title, resized)def str2bool(v):if v.lower() in ('yes', 'true', 't', 'y', '1'):return Trueelif v.lower() in ('no', 'false', 'f', 'n', '0'):return Falseelse:raise argparse.ArgumentTypeError('Boolean value expected.')# 構建命令行參數及解析
ap = argparse.ArgumentParser()
ap.add_argument("-s", "--source", required=True,help="Path to the source image")
ap.add_argument("-t", "--target", required=True,help="Path to the target image")
ap.add_argument("-o", "--output", help="Path to the output image (optional)")
args = vars(ap.parse_args())# 加載照片
source = cv2.imread(args["source"])
target = cv2.imread(args["target"])# 轉換原圖的顏色到目標圖像
transfer = color_transfer(source, target)# 檢查是否保存輸出圖像
if args["output"] is not None:cv2.imwrite(args["output"], transfer)# 展示照片直至按鍵
show_image("Source", source)
show_image("Target", target)
show_image("Transfer", transfer)
cv2.waitKey(0)

參考

  • https://www.pyimagesearch.com/2014/06/30/super-fast-color-transfer-images/
  • https://github.com/seminar2012/color_transfer

總結

以上是生活随笔為你收集整理的使用Python和OpenCV在图像之间执行超快速的颜色转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。