使用Python、OpenCV进行图像接缝雕刻
使用Python、OpenCV進行圖像接縫雕刻
- 1. 效果圖
- 2. 原理
- 3. 安裝——鑒于算法的專利原因,0.16以上版本均去掉了接縫雕刻算法;
- 4. 源碼
- 參考
這篇博客將介紹基于圖像內容感知調整的接縫雕刻算法。Avidan和Shimar證明了接縫雕刻不僅可以用于縮小圖像尺寸,還可以用于增大圖像尺寸;然而,scikit圖像實現目前只支持下采樣。
接縫雕刻算法也有它的局限性,對于接縫雕刻,該缺陷表現為圖像的重要語義信息被部分破壞或完全切斷,視覺效果不佳。
1. 效果圖
原始圖 VS 水平接縫效果圖
如下圖,可以看到已經從圖像中刪除了垂直接縫,從而減小了圖像寬度。
也可以通過移除水平接縫來降低圖像高度:
原始圖 VS 垂直接縫效果圖
如下圖,可以看到已經從圖像中刪除了水平接縫,從而減小了圖像高度。
根據原始圖像計算能量圖(即梯度圖)
2. 原理
接縫雕刻算法是什么?
接縫雕刻算法通過移除/添加低能量的接縫來調整圖像的大小(包括上采樣和下采樣)。
接縫定義為從左到右或從上到下流動的連接像素,前提是它們穿過圖像的整個寬度/高度。
調用 transfrom.seam_carve(image, mag, ‘vertical’, numSeams) 來進行接縫雕刻
- 原始圖像,要調整大小的輸入圖像。
- 能量圖,可以從原始圖像得到能量圖。能量圖應該代表圖像中最顯著的區域。通常是梯度幅度表示(即Sobel、Scharr等算子的輸出)、熵映射或顯著性映射。使用此圖像作為輸入,可以計算梯度大小作為能量圖;
- 方向 垂直或水平
- 移除的像素大小
接縫雕刻算法原理?
接縫雕刻算法的工作原理是尋找連接的像素,稱為低能量(即最不重要的)接縫,從左到右或從上到下遍歷整個圖像。
然后從原始圖像中刪除這些接縫,允許調整圖像大小,同時保留最顯著的區域(原始算法還支持添加接縫,允許增加圖像大小)。
這些接縫通過動態規劃有效地計算,并按其能量排序。低能量接縫放在列表的前面,而高能量接縫放在列表的后面。
調整圖像的大小,可以移除能量較低的接縫以對圖像進行下采樣,或者復制能量較低的接縫以對圖像進行上采樣。
接縫雕刻的目的是調整圖像本身的大小,并且仍然保留圖像中最顯著(即“有趣”)的區域。
使用傳統的調整大小的方法會改變整個圖像的尺寸,而不需要考慮確定圖像的哪個部分最重要或最不重要。
Seam carving應用從能量圖導出的啟發式/路徑查找來確定可以刪除/復制圖像的哪些區域,以確保(1)保留圖像的所有“有趣”區域,(2)以美觀的方式完成。
以一種美觀的方式保存圖像中最有趣的區域要比聽起來困難得多。雖然接縫雕刻看起來很神奇,但實際上并非如此——而且它也有其局限性。接縫雕刻也有其局限性;
3. 安裝——鑒于算法的專利原因,0.16以上版本均去掉了接縫雕刻算法;
安裝哪個版本可參考:這個網站
如下,比0.16版本低的均可一試;本文用如下版本ok;
- windows 10
- python 3.7.4
- numpy 1.19.5+mkl
- scipy 1.6.0
- scikit-learn 0.24.1
- scikit-image 0.14.4
4. 源碼
# USAGE
# python seam_carving.py --image images/as.jpg
# python seam_carving.py --image images/as.jpg --direction horizontalimport argparseimport cv2
import imutils
from skimage import filters
# 導入必要的包
from skimage import transform# 構建命令行參數及解析
# --image 輸入圖像路徑
# --direction 應用接縫雕刻,移除相同像素的方向 水平或垂直
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to input image file")
ap.add_argument("-d", "--direction", type=str,default="vertical", help="seam removal direction")
args = vars(ap.parse_args())# 加載圖像,并轉換為灰度圖
image = cv2.imread(args["image"])
image = imutils.resize(image, width=250)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 計算Sobel梯度幅值表示(即能量圖)
mag = filters.sobel(gray.astype("float"))
cv2.imshow("mag", mag)
cv2.waitKey(0)# 展示原始圖像
cv2.imshow("Original", image)
# cv2.waitKey(0)# 函數只支持下采樣圖像-不提供上采樣支持。
# 遍歷接縫上打圈以移除
for numSeams in range(20, 80, 20):# 執行接縫雕刻,移除圖像中的幀數--“垂直”剪切將更改圖像高度,“水平”剪切更改圖像寬度carved = transform.seam_carve(image, mag, args["direction"],numSeams)# 新的雕刻圖像尺寸打印到終端print("[INFO] removing {} seams; new size: ""w={}, h={}".format(numSeams, carved.shape[1],carved.shape[0]))# 展示雕刻算法的輸出cv2.imshow("Carved", carved)cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2017/01/23/seam-carving-with-opencv-python-and-scikit-image/
- https://cloud.tencent.com/developer/article/1369676
總結
以上是生活随笔為你收集整理的使用Python、OpenCV进行图像接缝雕刻的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV从图像中删
- 下一篇: IDEA Java解析GeoJson.j