概要
Python是一種功能強大的編程語言,也是圖像處理領域中常用的工具之一。通過使用Python的圖像處理庫(例如Pillow、OpenCV等),開發(fā)者可以實現(xiàn)各種各樣的圖像特效。這些特效包括但不限于:濾鏡效果(如黑白、模糊、銳化等)、顏色轉(zhuǎn)換、邊緣檢測、形狀識別、圖像合成和增強現(xiàn)實效果等。
在Python中,可以使用各種算法和技術來處理圖像,例如卷積操作、顏色空間轉(zhuǎn)換、形態(tài)學操作等。通過這些技術,開發(fā)者可以創(chuàng)建出令人驚嘆的圖像特效,用于美化照片、設計藝術作品、實現(xiàn)計算機視覺應用等。
圖像處理的過程通常包括圖像的讀取、處理和保存。Python提供了簡單而靈活的API,使得這些操作變得容易。開發(fā)者可以加載圖像,對其進行各種操作,然后保存處理后的圖像,以便后續(xù)使用或展示。
讀入圖像
# 導入Pillow庫中的Image模塊
from PIL import Image
# 打開名為"landscape.jpg"的圖像文件
img = Image.open('./landscape.jpg')
# 獲取圖像的寬度和高度
width, height = img.size
print("圖像寬度:", width, "圖像高度:", height)
# 遍歷圖像的每個像素點
for x in range(0, height):
for y in range(0, width):
# 獲取當前像素點的紅色(r)、綠色(g)、藍色(b)通道的像素值
(r, g, b) = img.getpixel((x, y))
# 打印每個像素點的RGB值
print("像素點 (x:", x, ", y:", y, ") 的RGB值: (R:", r, ", G:", g, ", B:", b, ")")
在以上代碼片段中,我們使用了Python的Pillow庫來進行圖像處理。首先,我們打開了名為"landscape.jpg"的樣例圖像,并獲取了圖像的寬度和高度。接著,我們使用嵌套的循環(huán)遍歷圖像的所有像素點。在每個像素點,我們使用getpixel((x, y))方法獲取了紅色(r)、綠色(g)、藍色(b)三個通道的像素值。
通過這個嵌套循環(huán),我們可以逐個打印出圖像中每個像素的RGB值,從而了解圖像的構(gòu)成。這種方式可以作為圖像處理的基礎,為后續(xù)的圖像處理操作提供了基礎數(shù)據(jù)。這樣的操作使得我們能夠更深入地了解圖像,為后續(xù)的圖像處理任務提供了必要的信息。
報錯;
D:\anaconda\envs\yolov5\python.exe E:\yolo項目\Opencv-project-main\Opencv-project-main\CVZone\guangliu\33.py
圖像寬度: 938 圖像高度: 613
Traceback (most recent call last):
File "E:\yolo項目\Opencv-project-main\Opencv-project-main\CVZone\guangliu\33.py", line 15, in <module>
(r, g, b) = img.getpixel((x, y))
ValueError: too many values to unpack (expected 3)
Process finished with exit code 1
解決辦法一:
錯誤提示表明在(r, g, b) = img.getpixel((x, y))這一行代碼中,getpixel((x, y))返回的值不是期望的3個像素通道值(紅、綠、藍),而是更多的值,因此Python無法將這些值正確地分配給(r, g, b)。這種情況通常發(fā)生在圖像模式(mode)不是RGB模式的時候。
可以在處理圖像之前,將圖像轉(zhuǎn)換為RGB模式。
# 將圖像轉(zhuǎn)換為RGB模式
img = img.convert('RGB')
修改代碼為:
# 導入Pillow庫中的Image模塊
from PIL import Image
# 打開名為"landscape.jpg"的圖像文件
img = Image.open('img_1.png')
# 將圖像轉(zhuǎn)換為RGB模式
img = img.convert('RGB')
# 獲取圖像的寬度和高度
width, height = img.size
print("圖像寬度:", width, "圖像高度:", height)
# 遍歷圖像的每個像素點
for x in range(0, height):
for y in range(0, width):
# 獲取當前像素點的紅色(r)、綠色(g)、藍色(b)通道的像素值
(r, g, b) = img.getpixel((x, y))
# 打印每個像素點的RGB值
print("像素點 (x:", x, ", y:", y, ") 的RGB值: (R:", r, ", G:", g, ", B:", b, ")")
結(jié)果:
解決辦法二:
修改傳遞參數(shù)即可,
將三個傳遞參數(shù)添加第四個d即可解決問題。
(r, g, b,d) = img.getpixel((x, y))
完整代碼
# 導入Pillow庫中的Image模塊
from PIL import Image
# 打開名為"landscape.jpg"的圖像文件
img = Image.open('img_1.png')
# 獲取圖像的寬度和高度
width, height = img.size
print("圖像寬度:", width, "圖像高度:", height)
# 遍歷圖像的每個像素點
for x in range(0, height):
for y in range(0, width):
# 獲取當前像素點的紅色(r)、綠色(g)、藍色(b)通道的像素值
(r, g, b,d) = img.getpixel((x, y))
# 打印每個像素點的RGB值
print("像素點 (x:", x, ", y:", y, ") 的RGB值: (R:", r, ", G:", g, ", B:", b, ")")
結(jié)果依舊
改變單個通道
首先使用Pillow庫打開了名為"landscape.jpg"的圖像文件。然后,我們獲取了圖像的寬度和高度,并創(chuàng)建了一個新的圖像對象new_img,它具有相同的大小。接著,我們使用嵌套的循環(huán)遍歷原始圖像的每個像素點。
在每個像素點,我們使用img.getpixel((col, row))獲取紅、綠、藍三個通道的像素值。然后,我們將原始圖像的綠色通道的像素值增加了50,創(chuàng)建了一個新的顏色。這個新顏色包含了原始紅色通道的值(r),綠色通道的值增加了50(g+50),和原始藍色通道的值(b)。最后,我們使用new_img.putpixel((col, row), (r, g + 50, b))將修改后的像素值放入新圖像對象中。
# 導入Pillow庫中的Image模塊
from PIL import Image
# 打開名為"landscape.jpg"的圖像文件
img = Image.open('img_1.png')
# 獲取圖像的寬度和高度
width, height = img.size
print("原始圖像寬度:", width, "圖像高度:", height)
# 創(chuàng)建一個新的RGB模式的圖像對象,具有相同的大小
new_img = Image.new('RGB', (width, height))
# 遍歷原始圖像的每個像素點
for row in range(0, height):
for col in range(0, width):
# 獲取當前像素點的紅色(r)、綠色(g)、藍色(b)通道的像素值
(r, g, b) = img.getpixel((col, row))
# 修改綠色通道的像素值,增加50
new_green = g + 50
# 將修改后的像素值放入新圖像對象中
new_img.putpixel((col, row), (r, new_green, b))
# 將修改后的圖像保存為"landscape_edited.png"文件
new_img.save("landscape_edited1.png")
# 打印提示信息
print("圖像處理完成,并保存為landscape_edited.png")
報錯依舊:
按照上述方法二選一即可解決報錯問題,我用添加的方法二避免報錯。
完整代碼
# 導入Pillow庫中的Image模塊
from PIL import Image
# 打開名為"landscape.jpg"的圖像文件
img = Image.open('img_1.png')
# 獲取圖像的寬度和高度
width, height = img.size
print("原始圖像寬度:", width, "圖像高度:", height)
# 創(chuàng)建一個新的RGB模式的圖像對象,具有相同的大小
new_img = Image.new('RGB', (width, height))
# 遍歷原始圖像的每個像素點
for row in range(0, height):
for col in range(0, width):
# 獲取當前像素點的紅色(r)、綠色(g)、藍色(b)通道的像素值
(r, g, b,d) = img.getpixel((col, row))
# 修改綠色通道的像素值,增加50
new_green = g + 50
# 將修改后的像素值放入新圖像對象中
new_img.putpixel((col, row), (r, new_green, b,d))
# 將修改后的圖像保存為"landscape_edited.png"文件
new_img.save("landscape_edited1.png")
# 打印提示信息
print("圖像處理完成,并保存為landscape_edited.png")
結(jié)果:
這里也放方法一的結(jié)果:
依然可以完成這樣的結(jié)果。
黑白特效
為了實現(xiàn)基本的黑白特效,我們必須確保所有3個通道都具有相同的值。
讓我們再次迭代每個像素,并計算三個通道像素值的平均值:
# 導入Pillow庫中的Image模塊
from PIL import Image
# 打開圖片文件
img = Image.open('img_1.png')
# 將圖像轉(zhuǎn)換為RGB模式
img = img.convert('RGB')
# 獲取圖片的寬度和高度
width, height = img.size
# 輸出圖片的寬度和高度
print("原始圖片大?。?, width, height)
# 創(chuàng)建一張新的RGB模式的圖片,大小與原始圖片相同
new_img = Image.new('RGB', (width, height))
# 遍歷原始圖片的每個像素
for row in range(0, height):
for col in range(0, width):
# 獲取當前像素點的RGB顏色值
(r, g, b) = img.getpixel((col, row))
# 計算RGB三個通道的平均值,將像素點轉(zhuǎn)換為灰度
avg = int((r + g + b) / 3)
# 在新圖片上設置當前像素點的顏色為灰度值,實現(xiàn)黑白效果
new_img.putpixel((col, row), (avg, avg, avg))
# 將處理后的黑白圖片保存為'landscape_black_and_white.jpg'
new_img.save("landscape_black_and_white.jpg")
# 輸出處理后的圖片保存成功的消息
print("黑白圖片已保存為'landscape_black_and_white.jpg'")
顏色反轉(zhuǎn)
看懂了上述代碼,那么顏色反轉(zhuǎn)的實現(xiàn)現(xiàn)在應該會很簡單!
簡單來說。我們的目標是將黑色像素(0,0,0)轉(zhuǎn)換為白色像素(255,255,255)。
from PIL import Image
img = Image.open('img_1.png')
# 將圖像轉(zhuǎn)換為RGB模式
img = img.convert('RGB')
width, height = img.size
print(width, height)
new_img = Image.new('RGB', (width, height))
for row in range(0, height):
for col in range(0, width):
(r, g, b) = img.getpixel((col, row))
inverted_pixel = (255 - r, 255-g, 255-b)
new_img.putpixel((col, row), inverted_pixel)
new_img.save("landscape_edited.jpg")
文章來源:http://www.zghlxwxcb.cn/news/detail-736107.html
將圖像拆分成四個子部分
from PIL import Image
img = Image.open('img_1.png')
# 將圖像轉(zhuǎn)換為RGB模式
img = img.convert('RGB')
width, height = img.size
print(width, height)
new_img = Image.new('RGB', (width, height))
for row in range(0, height):
for col in range(0, width):
(r, g, b) = img.getpixel((col, row))
if col < width * 0.25:
(r, g, b) = (r, g, b)
elif col < width * 0.5:
avg = int((r + g + b) / 3)
(r, g, b) = (avg, avg, avg)
elif col < width * 0.75:
(r, g, b) = (r, g + 50, b)
else:
(r, g, b) = (255 - r, 255 - g, 255 - b)
new_img.putpixel((col, row), (r, g, b))
new_img.save("landscape_edited.jpg")
小結(jié):
機器學習報錯解決2——ValueError: too many values to unpack (expected 3)
這個文章里面的東西被參考,我用來做方法二,可以說有點用,但是方法一是最好的辦法,避免方法二的傳參問題,如果有參數(shù)傳遞錯誤,或者是版本問題導致庫的傳參問題,可以使用方法二
。文章來源地址http://www.zghlxwxcb.cn/news/detail-736107.html
到了這里,關于【OpenCV實現(xiàn)圖像:用Python生成圖像特效,報錯ValueError: too many values to unpack (expected 3)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!