中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用python實現一個合成圖片功能

發布時間:2020-11-10 14:37:12 來源:億速云 閱讀:210 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關如何利用python實現一個合成圖片功能,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

python的PIL庫簡直好用的不得了,PIL下面的Image庫更是封裝了很多對圖片處理的函數,關于Image庫的介紹和使用,看這里:http://effbot.org/imagingbook/image.htm

這里用我半個月前看到的一篇博客寫的demo作為背景,做一下圖片的合成

圖片可以看作是很多像素點組成的,每個像素點都是一個RGB顏色,(red, green, blue), 那么合成兩張照片就有辦法了,我們可以在一張新的RGB色的圖片里一個像素點取圖片一的對應位置的像素,下一個像素點取圖片二的像素,直到遍歷完成,代碼如下:

from PIL import Image

##這里采用傳入圖片地址調用此函數

#這個方法目前不支持按比例合成,默認為1:1
#各取一個像素點合并,傳入的參數為兩張圖片的地址
def merge1(img1_address,img2_addess):
 status=100
 #狀態碼100為正常
 #  200為地址錯誤
 try:
  img1=Image.open(img1_address)
  img2=Image.open(img2_address)
 except:
  status=200
  img_new=""
 else:
  width=min(img1.size[0],img2.size[0])
  height=min(img1.size[1],img2.size[1])
  print(width,height)
  img_new = Image.new('RGB',(width,height))
  for x in range(width):
   for y in range(height):
    if y%2==0:
     pixel=img1.getpixel((x,y))
     img_new.putpixel((x,y),pixel)
    else:
     pixel=img2.getpixel((x,y))
     img_new.putpixel((x,y),pixel)
 finally:
  return img_new,status

上述代碼會返回一張新的圖片和一個狀態碼,接受的時候用兩個變量接受

另一種方法是每個像素點各取%50的原圖片的顏色,然后把像素點放置在對應位置,為了功能更加強大,我把兩者的混合比例設為可調,默認是50%的比例,代碼如下:

from PIL import Image

#將像素點按比例取色,然后合成一個新像素點
#傳入的參數為兩張圖片的地址和比例
#如果兩者之和不為1則以第一個圖片的比例為準
def merge2(img1_address,img2_address,percent1=0.50,percent2=0.50):
 status=100
 #狀態碼100為正常
 #  200為地址錯誤
 try:
  img1=Image.open(img1_address)
  img2=Image.open(img2_address)
 except:
  status=200
  img_new=""
 else:
  if percent1+percent2!=1:
   percent2=1-percent1
  width = min(img1.size[0],img2.size[0])
  height = min(img1.size[1],img2.size[1])
  img_new = Image.new('RGB',(width,height))
  for x in range(width):
   for y in range(height):
    r1,g1,b1=img1.getpixel((x,y))
    r2,g2,b2=img2.getpixel((x,y))
    r=int(percent1*r1+percent2*r2)
    g=int(percent1*g1+percent2*g2)
    b=int(percent1*b1+percent2*b2)
    img_new.putpixel((x,y),(r,g,b))
 finally:
  return img_new,status

返回的參數與上述相同
 如果想要保存圖片可用image.save()函數保存

總的代碼如下:

from PIL import Image

##這里采用傳入圖片地址調用此函數

#這個方法目前不支持按比例合成,默認為1:1
#各取一個像素點合并,傳入的參數為兩張圖片的地址
def merge1(img1_address, img2_addess, direct):
 status=100
 #狀態碼100為正常
 #  200為地址錯誤
 try:
  img1=Image.open(img1_address)
  img2=Image.open(img2_address)
 except:
  status=200
  img_new=""
 else:
  width=min(img1.size[0], img2.size[0])
  height=min(img1.size[1], img2.size[1])
  print(width,height)
  img_new = Image.new('RGB',(width, height))
  for x in range(width):
   for y in range(height):
    if y%2 == 0:
     pixel = img1.getpixel((x,y))
     img_new.putpixel((x,y), pixel)
    else:
     pixel = img2.getpixel((x,y))
     img_new.putpixel((x,y), pixel)
 finally:
  return status

#將像素點按比例取色,然后合成一個新像素點
#傳入的參數為兩張圖片的地址和比例
#如果兩者之和不為1則以第一個圖片的比例為準
def merge2(img1_address, img2_address, direction, percent1):

 status = 100
 #狀態碼100為正常
 # 200為地址錯誤
 try:
  img1 = Image.open(img1_address)
  img2 = Image.open(img2_address)
 except:
  status = 200
  img_new = ""
 else:
  percent2 = 1 - percent1
  width = min(img1.size[0], img2.size[0])
  height = min(img1.size[1], img2.size[1])
  img_new = Image.new('RGB', (width,height))
  for x in range(width):
   for y in range(height):
    r1,g1,b1=img1.getpixel((x,y))
    r2,g2,b2=img2.getpixel((x,y))
    r = int(percent1 * r1 + percent2 * r2)
    g = int(percent1 * g1 +percent2 * g2)
    b = int(percent1 * b1 +percent2 * b2)
    img_new.putpixel((x,y),(r,g,b))
  img_new.save(direction)
  #img_new.show()
 finally:
  return status
 #切記在接受返回信息時先判斷狀態碼是否異常,如果正確再執行相應操作
if __name__=='__main__':

 img1_address = "B:\Picture\YourName\1.jpg"
 img2_address = "B:\Picture\YourName\2.jpg"
 direction = "D:/Python/PyQt/課程設計/merges/merge9.png"
 status = merge2(img1_address, img2_address, direction, 0.30)
 print(status)

當然,我發現Image庫中有Image.blend(image1, image2, alpha)這個混合圖片的函數,還沒看源碼,不知道他是用什么方法實現的。

原先的兩張照片:

如何利用python實現一個合成圖片功能

合成后的照片:

 如何利用python實現一個合成圖片功能

左圖是方法一,右圖是方法二

優劣: 
方法一不易造成曝光過度,因為實際的像素點并沒改動,只是間隔變大了,但這樣可能會造成輪廓不清晰 
方法二在比例適當時效果是優于方式一的,但比例不合適就會看起來像曝光過度一樣,示例中方法二用的比例是0.3:0.7,又是比例不當效果會很糟糕,孰優孰劣請按效果好壞使用。

關于如何利用python實現一個合成圖片功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德化县| 潼关县| 永济市| 将乐县| 宿州市| 磐安县| 罗平县| 松溪县| 陵川县| 元谋县| 丹东市| 博罗县| 卓尼县| 当涂县| 城固县| 西吉县| 平泉县| 黑龙江省| 桐柏县| 龙川县| 边坝县| 临夏市| 朝阳县| 准格尔旗| 安徽省| 叶城县| 松潘县| 海口市| 北碚区| 含山县| 巩留县| 张家界市| 商城县| 武强县| 伊川县| 曲阳县| 阿克陶县| 雅江县| 克东县| 泽库县| 辽阳县|