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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机视觉学习(三):仿射变换将一幅图像放置到另一幅图像中

發布時間:2023/12/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机视觉学习(三):仿射变换将一幅图像放置到另一幅图像中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本例子為通過仿射扭曲變換將圖像放置到另一幅圖像中,使得它們能夠和指定的區域或者標記物對齊。

? 運行的代碼如下:

# test.py from PCV.geometry import warp, homography from PIL import Image from pylab import * from scipy import ndimage#放射扭曲im1到im2 #打開兩張圖片 im1 = array(Image.open('D:\pythonxy\image/wen.jpg').convert('L')) im2 = array(Image.open('D:\pythonxy\image/yu.jpg').convert('L'))#設置映射的目標點 tp = array([[240,375,375,240],[143,145,275,275],[1,1,1,1]])#使用仿射變換將im1放置在im2上,使im1圖像的角和tp盡可能的靠近 im3 = warp.image_in_image(im1,im2,tp)#將圖像灰度顯示 figure() gray() subplot(131) axis('off') imshow(im1) subplot(132) axis('off') imshow(im2) subplot(133) axis('off') imshow(im3)#選定im1角上的一些點 m,n = im1.shape[:2] fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])# 第一個三角形 tp2 = tp[:,:3] fp2 = fp[:,:3]# 計算仿射變換H,并且將其應用于圖像im1 H = homography.Haffine_from_points(tp2,fp2)#affine仿射變換的方式把第一幅圖像變到第二幅圖像里面 im1_t = ndimage.affine_transform(im1,H[:2,:2], (H[0,2],H[1,2]),im2.shape[:2]) # 對圖像進行alpha通道處理,三角形的alphy alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1]) #創建alpha圖像 im3 = (1-alpha)*im2 + alpha*im1_t axis('off') show()

? 運行的結果圖如下:

圖二建筑物來源于集美大學

?

其中主要用到了兩個函數:warp 和 homography(單應)

? warp函數中又用到了兩個方法:image_in_image() 和?alpha_for_triangle()

? ? image_in_image() 方法的代碼如下:

#tp是齊次表示的,并且是按照從左上角逆時針計算的 #使用仿射變換將im1放置在im2上,使im1圖像的角和tp盡可能的靠近 def image_in_image(im1,im2,tp):# 扭曲的點m,n = im1.shape[:2]#點的坐標fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])#算出兩個圖像間的變換關系,返回給定對應點的最優仿射變換,并用H表示H = homography.Haffine_from_points(tp,fp)#affine通過仿射變換的方式把第一幅圖像變到第二幅圖像里面im1_t = ndimage.affine_transform(im1,H[:2,:2],(H[0,2],H[1,2]),im2.shape[:2])#alpha通道對圖像進行處理alpha = (im1_t > 0)return (1-alpha)*im2 + alpha*im1_t

? ? 該方法的輸入參數為兩幅圖像和一個tp坐標,該坐標為將第一幅圖像放置到第二幅圖像中的角點坐標,是齊次表示的。然后將扭曲的im1圖像和im2圖像融合,創建alpha圖像。該alpha圖像定義了每個像素從各個圖像中獲取的像素值成分的多少。扭曲的 圖像是在扭曲區域邊界以外用0來填充的圖像,以此來創建一個二值的alpha圖像。所以從嚴格意義上來說,我們需要在第一幅圖像中的潛在0像素上加上一個小的數值。

? ? alpha_for_triangle() 方法的代碼如下:

def alpha_for_triangle(points,m,n):#對于由角點定義的三角形創建大小為(m,n)的alpha映射(在歸一化齊次坐標中給出) alpha = zeros((m,n))for i in range(min(points[0]),max(points[0])):for j in range(min(points[1]),max(points[1])):x = linalg.solve(points,[i,j,1])#如果所有系數為正if min(x) > 0:alpha[i,j] = 1#返回alpha的值return alpha

? ? alpha通道是一個8位的灰度通道,該通道用256級灰度來記錄圖像中的透明度信息,定義透明、不透明和半透明區域,其中白表示不透明,黑表示透明,灰表示半透明。使用alpha通道來給圖像增加透明度。這里我們簡單地為每個三角形創建了alpha圖像,然后將所有的圖像合并起來。該三角形的alpha圖像可以簡單地通過檢查像素的坐標能否寫成三角形頂點坐標的凸組合來計算得出。如果坐標可以表示成這種形式,那么該像素就位于三角形的內部。

??homography函數中用到了Haffine_from_points()方法

? ??Haffine_from_points()方法的代碼如下:

def Haffine_from_points(fp,tp): #對H進行仿射變換,tp是fp的仿射輸注if fp.shape != tp.shape:raise RuntimeError('number of points do not match')#條件點m = mean(fp[:2], axis=1)maxstd = max(std(fp[:2], axis=1)) + 1e-9C1 = diag([1/maxstd, 1/maxstd, 1]) C1[0][2] = -m[0]/maxstdC1[1][2] = -m[1]/maxstdfp_cond = dot(C1,fp)# 條件點指向m = mean(tp[:2], axis=1)C2 = C1.copy() #must use same scaling for both point setsC2[0][2] = -m[0]/maxstdC2[1][2] = -m[1]/maxstdtp_cond = dot(C2,tp)# 條件點的平均值為零,所以平移為零A = concatenate((fp_cond[:2],tp_cond[:2]), axis=0)U,S,V = linalg.svd(A.T)# 創建B、C矩陣tmp = V[:2].TB = tmp[:2]C = tmp[2:4]tmp2 = concatenate((dot(C,linalg.pinv(B)),zeros((2,1))), axis=1) H = vstack((tmp2,[0,0,1]))# 仿射H = dot(linalg.inv(C2),dot(H,C1))return H / H[2,2]

? ? 該方法會返回給定對應點的最優仿射變換。以本例子來說,對應點為圖像和黑方塊的角點,如果透視效應比較弱,那么這種方法會返回很好的結果。

? ? 透視變換的本質是將圖像投影到一個新的視平面。仿射變換可以理解為透視變換的特殊形式。

? ??一幅圖像就是一個像素坐標系下的各個帶有像素值的坐標點,而透視變換可以理解為就是將一幅圖像中的這些坐標點完成了一個坐標轉換,將它們的坐標變換到了其他位置,從而實現了變換了圖像視角的效果。因此,透視變換和相機標定等概念其實并沒有什么內在關系。在車道線檢測中的“相機標定”過程,其實就是做了一個透視變換,即相機畫面圖像和一幅假想的地面圖像這兩幅圖像之間的變換關系,所謂假想的地面圖像,即將實際地面上各點距離(離車輛后軸中心點)按一個設定的尺度放到一張圖像上(鳥瞰圖),此時只要是在這個地平面上的點,通過透視變換都可以得到其在相機圖像上的點的坐標。因為假想的是在地平面上的點做的透視變換,所以此時只有位于地平面上的物體,才具有真正的鳥瞰圖像素值,投影到圖像上才是正常的。

總結

以上是生活随笔為你收集整理的计算机视觉学习(三):仿射变换将一幅图像放置到另一幅图像中的全部內容,希望文章能夠幫你解決所遇到的問題。

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