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

歡迎訪問 生活随笔!

生活随笔

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

生活经验

使用Python,OpenCV实现图像之间超快速的颜色转移

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

圖像之間超快速的顏色轉移

    • 1. 效果圖
    • 2. 步驟
    • 3. 改進算法的方法
    • 4. 源碼
    • 參考

目標:源圖像與目標圖像,轉移源圖像的色彩空間到目標圖像,生成一張新的圖像;

有關如何在兩個圖像之間轉移顏色,有倆種方式,

  • (1)基于直方圖的方法,該方法旨在平衡三種“類型”的顏色:相等,過多和不足。 該方法獲得了良好的結果-但以速度為代價。使用此算法將要求您對源圖像中的每個像素執行查找,這將隨著圖像尺寸的增加而變得非常昂貴。

  • (2)僅使用圖像通道的均值和標準差的顏色轉移算法。沒有復雜的代碼。沒有計算直方圖。只是簡單的統計……這種方法甚至可以輕松處理巨大的圖像。

1. 效果圖

輸入源圖像和目標圖像。源圖像包含期待目標圖像模仿的色彩空間。
在下圖中,左側的藍色夢幻水母是我的源,中間的紅色水母是我的目標圖像,而右側的圖像是將左圖色彩應用于目標圖像的色彩空間。

2019年中秋節青島海洋世界里拍的水母圖,把夢幻的藍色(左圖)應用于目標烈焰紅(中間圖),合成獨特的水母“紅”(右邊圖);


水母2:左圖的色彩應用于目標圖夢幻的水母圖,得到右邊的結果圖(有點像拍出來的骨片的色彩);

水母轉換圖3:左圖 + 中間圖 = 右圖(結果是比較仙的淺紫色~~~)

2. 步驟

  1. 輸入來源和目標圖像。源圖像包含您希望目標圖像模仿的色彩空間。在此頁頂部的圖中,左側的水母圖像是我的源,中間的圖像是我的目標,而右側的圖像是應用到目標的源的色彩空間。
  2. 將源圖像和目標圖像都轉換為L * a * b *顏色空間。 L * a * b *顏色空間模擬了感知均勻性,其中顏色值的微小變化也應該在顏色重要性上產生相對相等的變化。與標準RGB顏色空間相比,L * a * b *顏色空間在模仿人類如何解釋顏色方面做得好得多,并且您將看到,它在顏色轉移方面效果很好。
  3. 分割源和目標圖像的顏色通道值。
  4. 為源圖像和目標圖像計算每個L * a * b *通道的平均值和標準差。
  5. 從目標通道中減去目標圖像的L * a * b *通道的平均值。
  6. 按目標的標準偏差除以源的標準偏差再乘以目標通道的比例來縮放目標通道。
  7. 為源圖像添加L * a * b 通道的均值。
  8. 裁剪掉[0,255]范圍之外的所有值。
  9. 將通道顏色值合并在一起。
  10. 從L * a * b 空間轉換回RGB顏色空間。

3. 改進算法的方法

該算法非常快,有一個缺點——它依賴于全局顏色統計信息,因此像素強度值相似的大區域會極大地影響平均值(進而影響總體顏色傳遞)

為了解決這個問題,有兩個解決方案:

  • (1)計算要模擬顏色的較小關注區域(ROI)中的源圖像的均值和標準偏差,而不是使用整個圖像。采用這種方法將使您的均值和標準差更好地表示您要使用的色彩空間。

  • (2)將k均值應用于兩個圖像。可以在L * a * b *顏色空間中的每個圖像的像素強度上聚類,然后使用歐幾里德距離確定最相似的兩個圖像之間的質心。

    然后,僅計算每個區域內的統計信息。同樣,這將使您的平均數和標準差更具“局部”效果,并有助于減輕全局統計數據的過分表達問題。當然,缺點是這種方法的速度要慢得多,因為添加了昂貴的聚類步驟。

4. 源碼

用到了 color_transfer模塊的方法,可通過 pip install color_transfer 安裝

# USAGE
# python example.py --source images/01.jpg --target images/02.jpg -o images/01_02.jpgimport argparseimport cv2
# 導入必要的類
from color_transfer import color_transferdef show_image(title, image, width=300):# resize圖像以使得圖像具有固定的大小,以便整個屏幕都可以展示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)# 構建命令行參數及解析
# --source 源圖像
# --target 目標圖像
# --output 是否輸出轉換后的圖像,此為其路徑
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/

總結

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

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