python圖片合成的示例
python的PIL庫簡直好用的不得了,PIL下面的Image庫更是封裝了很多對圖片處理的函數(shù),關于Image庫的介紹和使用,看這里:http://effbot.org/imagingbook/image.htm
這里用我半個月前看到的一篇博客寫的demo作為背景,做一下圖片的合成
圖片可以看作是很多像素點組成的,每個像素點都是一個RGB顏色,(red, green, blue), 那么合成兩張照片就有辦法了,我們可以在一張新的RGB色的圖片里一個像素點取圖片一的對應位置的像素,下一個像素點取圖片二的像素,直到遍歷完成,代碼如下:
from PIL import Image
##這里采用傳入圖片地址調用此函數(shù)
#這個方法目前不支持按比例合成,默認為1:1
#各取一個像素點合并,傳入的參數(shù)為兩張圖片的地址
def merge1(img1_address,img2_addess):
status=100
#狀態(tài)碼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
上述代碼會返回一張新的圖片和一個狀態(tài)碼,接受的時候用兩個變量接受
另一種方法是每個像素點各取%50的原圖片的顏色,然后把像素點放置在對應位置,為了功能更加強大,我把兩者的混合比例設為可調,默認是50%的比例,代碼如下:
from PIL import Image
#將像素點按比例取色,然后合成一個新像素點
#傳入的參數(shù)為兩張圖片的地址和比例
#如果兩者之和不為1則以第一個圖片的比例為準
def merge2(img1_address,img2_address,percent1=0.50,percent2=0.50):
status=100
#狀態(tài)碼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
返回的參數(shù)與上述相同
如果想要保存圖片可用image.save()函數(shù)保存
總的代碼如下:
from PIL import Image
##這里采用傳入圖片地址調用此函數(shù)
#這個方法目前不支持按比例合成,默認為1:1
#各取一個像素點合并,傳入的參數(shù)為兩張圖片的地址
def merge1(img1_address, img2_addess, direct):
status=100
#狀態(tài)碼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
#將像素點按比例取色,然后合成一個新像素點
#傳入的參數(shù)為兩張圖片的地址和比例
#如果兩者之和不為1則以第一個圖片的比例為準
def merge2(img1_address, img2_address, direction, percent1):
status = 100
#狀態(tài)碼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
#切記在接受返回信息時先判斷狀態(tài)碼是否異常,如果正確再執(zhí)行相應操作
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)
當然,我發(fā)現(xiàn)Image庫中有Image.blend(image1, image2, alpha)這個混合圖片的函數(shù),還沒看源碼,不知道他是用什么方法實現(xiàn)的。
原先的兩張照片:

合成后的照片:

左圖是方法一,右圖是方法二
優(yōu)劣:
方法一不易造成曝光過度,因為實際的像素點并沒改動,只是間隔變大了,但這樣可能會造成輪廓不清晰
方法二在比例適當時效果是優(yōu)于方式一的,但比例不合適就會看起來像曝光過度一樣,示例中方法二用的比例是0.3:0.7,又是比例不當效果會很糟糕,孰優(yōu)孰劣請按效果好壞使用。
以上就是python圖片合成的示例的詳細內(nèi)容,更多關于python圖片合成的資料請關注腳本之家其它相關文章!
相關文章
Python優(yōu)化列表接口進行分頁示例實現(xiàn)
最近,在做測試開發(fā)平臺的時候,需要對測試用例的列表進行后端分頁,在實際去寫代碼和測試的過程中,發(fā)現(xiàn)這里面還是有些細節(jié)的,故想復盤一下2021-09-09
python 虛擬環(huán)境調用allure報錯:FileNotFoundError: [WinError
python代碼調用命令行 allure命令報錯,提示找不到allure這個命令,本文就詳細的介紹了具體的解決方法,具有一定的參考價值,感興趣的可以了解一下2023-09-09

