実際の需要
少し前までは、クロールされたデータの処理にはパーソナライズされたワードクラウドの実装が必要ですが、背景画像の問題によって達成される効果は理想的ではありませんでした。背景画像を処理する方法はありません(パスが含まれることに注意してください)
元々のアイデアは、次の効果(お嬢様の輪郭のワードクラウドを生成する)を実現することでした
ので、画像を処理する必要があります(処理済みの画像)
二値化
絵の輪郭がはっきりしないので、最初は二値化を考えていたので、欲しいワードクラウドを生成する方法がありませんでしたが、二値化によって全体の輪郭を抽出できることは明らかです。クローラーが検証コードを抽出するために使用する一般的な方法
以下は、処理された画像です。
コードは次のとおりです。
def change_L(path,save_path,show_yes=1):
image=Image.open(path)
# image = image.convert('1')
image=image.convert('L')
t=[]
for i in range(256):
#杂质越多,值越大(轮廓越黑越明显)
if i<160:
t.append(0)
else:
t.append(1)
image=image.point(t,'1')
image.save(save_path)
if show_yes:
image.show()
ただ、まだまだ結果が伸びている
ので、今回は考えないといけないのですが、今回は他の人の背景写真を参考にして、写真の色違いの問題だと思いました。比較的言えば、まだはっきりしていませんので、まずは色を変えてみようと思います。写真は2値化されて一部の不純物が除去されるため、着色に便利です。
黒と白のカラーリング
具体的なアイデアは、
黒(0,0,0)、白(255,255,255)をピクセルRGB値で
変更することです。そうすれば簡単です。黒のrgb値を置き換えるには、ここで緑に変更してから、新しい画像を再描画します。
from PIL import Image
def change_L(path,save_path,show_yes=1):
image=Image.open(path)
# image = image.convert('1')灰度处理
image=image.convert('L')
t=[]
for i in range(256):
#杂质越多,值越大(轮廓越黑越明显)
if i<160:
t.append(0)
else:
t.append(1)
image=image.point(t,'1')
image.save(save_path)
if show_yes:
image.show()
def chang_rgb(path,save_path,rgb_change=(50,205,50),show_yes=1):
im = Image.open(path)
width = im.size[0]
height = im.size[1]
new_image = Image.new("RGB",(width,height))
im = im.convert('RGB')
# array = []
for x in range(width):
for y in range(height):
r, g, b = im.getpixel((x,y))
rgb = (r, g, b)
if rgb == (0,0,0):
rgb=rgb_change
new_image.putpixel((x, y), (int(rgb[0]), int(rgb[1]), int(rgb[2])))
# array.append(rgb)
# print(array)
new_image.save(save_path)
if show_yes:
new_image.show()
if __name__=='__main__':
star_path=r'E:\projects\python_projects\worldcloudtext\pic\01.jpg'
save_path = r'E:\projects\python_projects\worldcloudtext\pic_L.png'
change_L(star_path,save_path,1)
save_path_rgb=r'E:\projects\python_projects\worldcloudtext\pic_c_rgb.png'
chang_rgb(save_path,save_path_rgb,(50,205,50),1)
print('ok')
次に、他の写真をテストします
画像比較
今のケースを通して、2つの写真の類似性を判断するために以前のアプローチの派生物を作成します。
from PIL import Image
def compare(path1,path2,show_yes=1):
def pic_change(path):
image1 = Image.open(path)
image1 = image1.resize((500, 500))
image1 = image1.convert("RGB")
return image1
image1=pic_change(path1)
image2=pic_change(path2)
toutlo = 500*500
same_p=0
for x in range(500):
for y in range(500):
r1,g1,b1=image1.getpixel((x,y))
r2, g2, b2 = image2.getpixel((x, y))
if r1==r2 and g1 ==g2 and b2 == b1:
same_p+=1
present = (same_p / toutlo)*100
if show_yes:
print("%f%s"%(present,"%"))
if __name__=='__main__':
path1='1.png'
path2 = '2.png'
compare(path1,path2)
顔認識に関する予備研究
前の内容を考慮し
て、簡単な顔認識の比較
を自分で作成することもできます。最初にAndy Lauの写真を撮ります。
最初に前と同じように写真を処理し、
次に人間の頭の輪郭を抽出します。
具体的なアイデアは、最初にピクセルのRGB値を判断することです。上のピクセルが白、下が緑、または上が緑で下が白の場合、これは明らかにアウトラインです。前のピクセルと次のピクセルが両方とも緑の場合、アウトラインの端ではない場合は、rgb値を白に変更します。
from PIL import Image
def pic_change(path):
image1 = Image.open(path)
image1 = image1.resize((500, 500))
image1 = image1.convert("RGB")
return image1
image = pic_change(r'E:\projects\python_projects\pic_compare\see_rgb.png')
new_img=Image.new("RGB",(500,500))
for x in range(500):
for y in range(500):
r,g,b=image.getpixel((x,y))
rgb = (r, g, b)
if rgb!=(255,255,255):
if y>1 and y<499:
r1,g1,b1=image.getpixel((x,y-1))
rgb1=(r1,g1,b1)
r2, g2, b2 = image.getpixel((x,y+1))
rgb2 = (r2, g2, b2)
if rgb1 ==(255,255,255) and rgb ==(50,205,50) and rgb2 ==(20,205,50):
rgb=(50,205,50)
elif rgb1 ==(20,205,50) and rgb ==(50,205,50) and rgb2 ==(255,255,255):
rgb = (50, 205, 50)
if rgb1 ==(50,205,50) and rgb ==(50,205,50) and rgb2 ==(50,205,50):
rgb=(255,255,255)
new_img.putpixel((x,y),(int(rgb[0]), int(rgb[1]), int(rgb[2])))
new_img.show()
効果は次のとおりです
が、次の写真は引き伸ばされており(右のフアジに影があることがわかりました)、
恥ずかしいです。抽出された人間の顔でも
扱い方がよくありません。さて、とりあえず考えていませんが、確かに同じ写真を別の角度から見た写真なので
、できればデータベースを作って同じ顔と処理した写真の別の角度の効果をシミュレートし、ポジティブな写真データの比較を行うことができます。 (もちろん、これは私の推測です)
理想的な状態での比較
この場合、予備的な識別のために理想的な状態の画像を使用しましょう。
具体的なアイデアは、画像がマージナライズされた後の画像の緑色のピクセルの縦座標を記録することです。これは、垂直スキャンであり、次に特徴です。リスト(ここで提案されている主流のアルゴリズムではありませんが、私が自分で拡張したアイデア)の
後で、分散を直接使用して2つのリストの偏差を比較できます。
アルゴリズムは次のとおりです(画像が最初に処理されることに注意してください。上記のコードで)
from PIL import Image
def pic_change(path):
image1 = Image.open(path)
image1 = image1.resize((500, 500))
image1 = image1.convert("RGB")
return image1
def Dxmath(list_name):
sums = 0
sum_ = sum(list_name)
long = len(list_name)
agve = sum_ / long
for i in range(long):
x = list_name[i] - agve
x = x * x
sums += x
agves = sums / long
return agves
def outface(path,save_path,yes_show=1):
image = pic_change(path)
new_img=Image.new("RGB",(500,500))
for x in range(500):
for y in range(500):
r,g,b=image.getpixel((x,y))
rgb = (r, g, b)
if rgb!=(255,255,255):
if y>1 and y<499:
r1,g1,b1=image.getpixel((x,y-1))
rgb1=(r1,g1,b1)
r2, g2, b2 = image.getpixel((x,y+1))
rgb2 = (r2, g2, b2)
if rgb1 ==(255,255,255) and rgb ==(50,205,50) and rgb2 ==(20,205,50):
rgb=(50,205,50)
elif rgb1 ==(20,205,50) and rgb ==(50,205,50) and rgb2 ==(255,255,255):
rgb = (50, 205, 50)
if rgb1 ==(50,205,50) and rgb ==(50,205,50) and rgb2 ==(50,205,50):
rgb=(255,255,255)
new_img.putpixel((x,y),(int(rgb[0]), int(rgb[1]), int(rgb[2])))
new_img.save(save_path)
if yes_show:
new_img.show()
def issameorno(Standard_pic_path, path_need_compare):
path1 = Standard_pic_path
path2 = path_need_compare
image1 = pic_change(path1)
image2 = pic_change(path2)
list_image1 = []
list_image2 = []
rgb = (50, 205, 50)
for x in range(500):
for y in range(500):
'''纵向扫描'''
r1, g1, b1 = image1.getpixel((x, y))
rgb1 = (r1, g1, b1)
if rgb1 == rgb:
list_image1.append(y)
else:
list_image1.append(-1)
r2, g2, b2 = image2.getpixel((x, y))
rgb2 = (r2, g2, b2)
if rgb2 == rgb:
list_image2.append(y)
else:
list_image2.append(-1)
'''提取对比,我把一张图片纵向分割为500条线,把每条线的绿色点的纵坐标记录下来其余的记为-1
这样一来我就得到了这张人脸图片的特征列表,之后我要做的就是选择一个合适的算法去对比这两个列表的相似度
先确定一点如果等比例放大(尺度内)列表的总和不变,图片上下移动,总差值与非-1点数程倍数.
所以非-1点数与sum(list)相等就是同一个
image1为标准图.
'''
green1_point = len(list_image1) - list_image1.count(-1)
green2_point = len(list_image2) - list_image2.count(-1)
sum_1 = sum(list_image1)
sum_2 = sum(list_image2)
if green1_point == green2_point and sum_1 == sum_2:
print('they are same people')
else:
'''这里算方差吧'''
S1 = Dxmath(list_image1)
S2 = Dxmath(list_image2)
same_pa = (S1 / S2) * 100
print("%f%s" % (same_pa, "%"))
def main(path1,path2):
path1=path1
path2=path2
save_path=r'E:\projects\python_projects\pic_compare\outface.png'
save_path1 = r'E:\projects\python_projects\pic_compare\outface1.png'
outface(path1,save_path,0)
outface(path2, save_path1,0)
path11 = r'E:\projects\python_projects\pic_compare\outface.png'
path22 = r'E:\projects\python_projects\pic_compare\outface1.png'
issameorno(path11,path22)
if __name__=='__main__':
path1=r'E:\projects\python_projects\pic_compare\see_rgb.png'
path2=r'E:\projects\python_projects\pic_compare\see_rgb.png'
main(path1,path2)
ここで、画像に少し変更を加えます。ここでは、処理された画像に対してissameorno()関数を直接呼び出します。
もちろん、このアルゴリズムには大きな制限があります。
現在、人間の頭しか比較できません。そのような写真だとする
と、次のようになります。