<jupyter_start><jupyter_text>Q71 マスキングimori.jpgに対してHSVを用いて青色の箇所のみが黒くなるようにマスキングせよ。このように白黒のバイナリ画像を用いて黒部分に対応する元画像の画素を黒に変更する操作をマスキングという。青色箇所の抽出はHSVで180<=H<=260となる位置が1となるような二値画像を作成し、それの0と1を反転したものと元画像との積をとればよい。これによりある程度のイモリの部分の抽出ができる。.transpose : 次元の順番を入れ替える<jupyter_code>img = cv2.imread("imori.jpg")

hsv_img = functions.rgb2hsv(img)
mask = np.zeros_like(hsv_img[..., 0])
mask[np.logical_and((hsv_img[...,0]>=180),(hsv_img[...,0]<=260))] = 1
mask = 1- mask
mask = np.tile(mask,(3,1,1)).transpose(1,2,0)

out = img*mask
out = out.astype(np.uint8)
plt.imshow(cv2.cvtColor(out, cv2.COLOR_BGR2RGB)) 
plt.show()
n=5
img = cv2.imread("imori.jpg")

hsv_img = functions.rgb2hsv(img)
mask = np.zeros_like(hsv_img[..., 0])
mask[np.logical_and((hsv_img[...,0]>=180),(hsv_img[...,0]<=260))] = 255

# クロージング処理
result = np.copy(mask)
for i in range(n):
    result = functions.morphology_expand(result)
    
for i in range(n):
    result = functions.morphology_shrinkage(result)
    
# オープニング処理
for i in range(n):
    result = functions.morphology_shrinkage(result)
    
for i in range(n):
    result = functions.morphology_expand(result)

result//=255
result = 1-result
mask = np.tile(result,(3,1,1)).transpose(1,2,0)
out = img*mask
out = out.astype(np.uint8)
plt.imshow(cv2.cvtColor(out, cv2.COLOR_BGR2RGB)) 
plt.show()<jupyter_output><empty_output><jupyter_text>縮小と拡大imori.jpgをグレースケールにしたものを0.5倍に縮小した後に2倍に拡大した画像を求めよ。 この処理を行うと、ぼやけた画像ができる。拡大縮小にはbi-linear補間を用いよ。bi-linear補間をメソッド（関数）化すると、プログラムが簡潔にできる。<jupyter_code>def bi_linear(img,ax=1,ay=1):
    h,w,l = img.shape
    h_a = int(ay*h)
    w_a = int(ax*w)
    # get position of resized image
    y = np.arange(h_a).repeat(w_a).reshape(h_a, -1)
    x = np.tile(np.arange(w_a), (h_a, 1))

    # get position of original position
    y = (y / ay)
    x = (x / ax)

    ix = np.floor(x).astype(np.int32)
    iy = np.floor(y).astype(np.int32)

    ix = np.minimum(ix, w-2)
    iy = np.minimum(iy, h-2)

    # get distance 
    dx = x - ix
    dy = y - iy

    dx = np.repeat(np.expand_dims(dx, axis=-1), 3, axis=-1)
    dy = np.repeat(np.expand_dims(dy, axis=-1), 3, axis=-1)
    
    # interpolation
    out = (1-dx) * (1-dy) * img[iy, ix] + dx * (1 - dy) * img[iy, ix+1] + (1 - dx) * dy * img[iy+1, ix] + dx * dy * img[iy+1, ix+1]

    out = np.clip(out, 0, 255)
    out = out.astype(np.uint8)

    return out
img = cv2.imread("imori.jpg")

result = bi_linear(img,0.5,0.5)
result = bi_linear(result,2.0,2.0)
out = functions.grayscale(result)

plt.figure(figsize=(10,3))
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(out.astype(np.uint8), cv2.COLOR_BGR2RGB)) 
plt.show()<jupyter_output><empty_output><jupyter_text>Q74 ピラミッド差分による高周波成分の抽出Q.73で求めた画像と元画像の差分を求め、[0,255]に正規化せよ。ここで求めた画像はエッジとなっている。つまり、画像中の高周波成分をとったことになる。<jupyter_code>img = cv2.imread("imori.jpg")

gray_img = functions.grayscale(img)

result = bi_linear(img,0.5,0.5)
result = bi_linear(result,2.0,2.0)
out = functions.grayscale(result)

out = np.abs(out-gray_img)
out = out/out.max()*255

plt.figure(figsize=(10,3))
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(out.astype(np.uint8), cv2.COLOR_BGR2RGB)) 
plt.show()<jupyter_output><empty_output><jupyter_text>Q75 ガウシアンピラミッドここでは、元画像を1/2, 1/4, 1/8, 1/16, 1/32にリサイズした画像を求めよ。このように元画像を小さくリサイズして重ねたものをガウシアンピラミッドと呼ぶ。このガウシアンピラミッドの概念は現在でも有効であり、画像をきれいにする超解像を行うディープラーニングの手法でもガウシアンピラミッドの概念が用いられる。<jupyter_code>img = cv2.imread("imori.jpg")
gray_img = functions.grayscale(img)
pyramid = [gray_img]

for i in range(1,6):
    b = 1/(2**i)
    b_img = bi_linear(img,b,b)
    b_img = functions.grayscale(b_img)
    pyramid.append(b_img)


for i in range(1,7):
    #plt.subplot(1,6,i)
    H,W = pyramid[i-1].shape
    plt.figure(figsize=(W/32,H/32))
    plt.imshow(cv2.cvtColor(pyramid[i-1].astype(np.uint8), cv2.COLOR_BGR2RGB)) 
    plt.show()<jupyter_output><empty_output><jupyter_text>Q76 顕著性マップここではガウシアンピラミッドを用いた簡単な顕著性マップを作成する。顕著性マップとは画像の中で人間の目を引きやすい領域を表した画像である。現在ではディープラーニングによる顕著性マップがよく用いられるが、本来は画像のRGB成分やHSV成分などのガウシアンピラミッドを作成し、それらの差分から求める手法がよく用いられた(例えばIttiらの手法などがある)。<jupyter_code>pairs = [[0,1],[0,3],[0,5],[1,4],[2,3],[3,5]]

bi_linear_pyramid = [gray_img]
for i in range(1,6):
    b = 1/(2**i)
    b_img = bi_linear(img,b,b)
    b = 2**i
    b_img = bi_linear(b_img,b,b)
    b_img = functions.grayscale(b_img)
    bi_linear_pyramid.append(b_img)
    
H, W = bi_linear_pyramid[0].shape
out = np.zeros((H, W), dtype=np.float32)
for pair in pairs:
    out += np.abs(bi_linear_pyramid[pair[0]]-bi_linear_pyramid[pair[1]])
    
out = out / out.max() * 255
#for i in range(1,7):
    #plt.subplot(1,6,i)
    #plt.figure()
    #plt.imshow(cv2.cvtColor(bi_linear_pyramid[i-1].astype(np.uint8), cv2.COLOR_BGR2RGB)) 
    #plt.show()
    
plt.imshow(cv2.cvtColor(out.astype(np.uint8), cv2.COLOR_BGR2RGB))<jupyter_output><empty_output><jupyter_text>Q77 ガボールフィルタガボールフィルタを実装せよ。ガボールフィルタとはガウス分布と周波数変換を合わせたフィルタであり、画像の特定方向のみのエッジを抽出する時に使われる。ここでは、K=111, s=10, g = 1.2, l =10, p=0, A=0としてガボールフィルタを可視化せよ。ガボールフィルタを実際に使う時は、フィルタ値の絶対値の和が1になるように正規化すると使いやすくなる。答えでは可視化のためにフィルタの値を[0,255]に正規化している。<jupyter_code>def gaborFilter(K,s,g,l,p,A):
    out = np.zeros((K,K), dtype=np.float32)
    A = A/180*np.pi
    
    for y in range(K):
        for x in range(K):
            yt,xt = y-K//2,x-K//2
            xd = np.cos(A)*xt +np.sin(A)*yt
            yd = np.cos(A)*yt -np.sin(A)*xt
            out[y,x] = np.exp(-(xd**2 + g**2 * yd**2)/(2*(s**2)))*np.cos((2*np.pi*xd)/l+p)
    
    out /= np.sum(np.abs(out))
    return out
out = gaborFilter(K=111, s=10, g = 1.2, l =10, p=0, A=0)
out = out - np.min(out)
out = out/np.max(out)*255
plt.imshow(cv2.cvtColor(out.astype(np.uint8), cv2.COLOR_BGR2RGB))<jupyter_output><empty_output><jupyter_text>Q78 ガボールフィルタの回転ここでは A=0, 45, 90, 135として回転方向のガボールフィルタを求めよ。 その他のパラメータはQ.77同様、K=111, s=10, g = 1.2, l =10, p=0とせよ。<jupyter_code>plt.figure(facecolor="white")
for i,angle in enumerate([0,45,90,125]):
    plt.subplot(1,4,i+1)
    out = gaborFilter(K=111, s=10, g = 1.2, l =10, p=0, A=angle)
    out = out - np.min(out)
    out = out/np.max(out)*255
    plt.imshow(cv2.cvtColor(out.astype(np.uint8), cv2.COLOR_BGR2RGB))
    plt.title("angle = "+str(angle))
    
plt.show()<jupyter_output><empty_output><jupyter_text>Q79 ガボールフィルタによるエッジ抽出imori.jpgをグレースケール化し、A=0, 45, 90, 135 のガボールフィルタでフィルタリングせよ。パラメータはK=11, s=1.5, g=1.2, l=3, p=0とする。解答例の様に、ガボールフィルタで指定した方向のエッジが抽出できていることが分かる。 このようにガボールフィルタはエッジの特徴抽出に優れている。ガボールフィルタは生物の視神経における脳内の一次視覚野(V1)での働きに近いとされていて、つまり生物が見ている時の眼の前の画像の特徴抽出を再現しているともいわれる。<jupyter_code>img = cv2.imread("imori.jpg")
gray_img = functions.grayscale(img)

plt.figure(facecolor="white",figsize=(10,6))
for i,angle in enumerate([0,45,90,125]):
    plt.subplot(2,4,i+1)
    f = gaborFilter(K=11, s=1.5, g = 1.2, l =3, p=0, A=angle)
    out = cv2.filter2D(gray_img,-1,f)
    out = np.clip(out, 0, 255)
    out = out.astype(np.uint8)
    plt.imshow(out,cmap="gray")
    plt.title("angle = "+str(angle))
    
plt.show()<jupyter_output><empty_output><jupyter_text>Q80 ガボールフィルタによる特徴抽出Q.79で求めた４枚の画像を足し合わせることで、画像の特徴を抽出せよ。結果を見ると、画像の輪郭部分が白くなっていることからエッジ検出のような出力を得たように見える。<jupyter_code>img = cv2.imread("imori.jpg")
gray_img = functions.grayscale(img)

out = np.zeros_like(gray_img)

for i,angle in enumerate([0,45,90,125]):
    f = gaborFilter(K=11, s=1.5, g = 1.2, l =3, p=0, A=angle)
    _out = cv2.filter2D(gray_img,-1,f)
    _out = np.clip(_out, 0, 255)
    out += _out

out = out.astype(np.uint8)
plt.figure(facecolor="white")
plt.imshow(out,cmap="gray")
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1733492126505227, 'fraction_numerical': 0.05398967844382691, 'mean_word_length': 4.974703557312253, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '365154', 'license': 'MIT', 'n_tokens_mistral': 4515, 'n_tokens_neox': 4271, 'n_words': 439, 'path': 'Question_71_80/.ipynb_checkpoints/Myanswer-checkpoint.ipynb', 'repo_name': 'yudai0731/Gasyori100knock-1', 'size': '7557'}