kirazero
@kirazero

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

パイソン初心者です。画像処理についてお願いします。

パイソン初心者です。

画像処理の勉強をしているのですがプログラムのコードが分からないで困っています。

このように画像を読み込み、80画素のブロックで市松模様を作成したいです。
e531e38c0dbcb7e1.pdf - 個人 - Microsoft​ Edge 2021_08_12 23_15_33 (2).png

(1) 塗りつぶす色(灰色)は,(B, G, R) = (127, 127, 127) とします。
(2) ブロック数は,横8,縦6(すなわち,ブロックの画素数は縦横80画素)とします。
(3) 生成された市松模様の画像を cv.imshow で表示するとします.

プログラムコード

import sys
import cv2
import numpy as np
img = cv2.imread("./images/baloon.jpg", 1)
cv2.imshow("CHECKER", img)
h, w, d = img.shape[:3]
cv2.waitKey(0)
bx = w//8 # block number == 8 (horizontal); bx = 80
by = h//6 # block number == 6 (vertical); by = 80
for j in range(by):
for i in range(bx):
img[j,i] = [127, 127, 127] # Gray
cv2.imshow("CHECKER", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


このように自分で調べて途中までやってみたのですがよくわからなくなってしまいました。
すいませんがよろしくお願いします(´Д`)

0

6Answer

白黒の市松模様のマスク画像を先に作って、numpy.where関数でマスク画像がある場所のみ画素値を置換

import sys
import cv2
import numpy as np

img = cv2.imread("./images/baloon.jpg", 1)
cv2.imshow("CHECKER",img)
h, w, d = img.shape[:3]
print(h,w,d)
cv2.waitKey(0)
bx = w//8 # block number == 8 (horizontal); bx = 80
by = h//6 # block number == 6 (vertical); by = 80
#ここまではok
#このあとマスク画像を作る
mask=np.arange(w*h).reshape((h,w)) #マスク画像

maskx=np.where((mask//(bx*w))%2==0,0,1)
masky=np.where((mask//(by))%2==0,0,1)
mask=maskx^masky #XOR演算子 maskx,maskyどちらか一方が1のときのみ1、他は0

img2=img

for i in range (3):
    img2[:,:,i]=np.where(mask==1,img[:,:,i],127) #マスク画像がゼロの時、画素を127に置換
cv2.imshow("CHECKER", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
0Like

Comments

  1. 質問者さんのコードに付け足す形に修正しました。
    白黒の市松模様を作るコードを自分で書けるのであれば、numpy.whereでできます。
    numpy.where(条件式,Trueの場合,Falseの場合)の形の関数です。
    numpy.where((条件式)マスクの値が1,マスクが1であれば何もしない,マスクが0(条件式がFalse)であれば127に変更)で計算しています。

それはできるのですがフォルダにある画像を市松模様にしたいです。
私が書いたプログラムでは左上の1ブロックしか色がつかないので、、

0Like

マスク画像のx,y方向間違えているかも...
これに書き換えたら望みの結果になりますか?

maskx=np.where((mask//(bx))%2==0,0,1)
masky=np.where((mask//(h*by))%2==0,0,1)
0Like

その方針ならこうではないかと。

maskx = mask // bx % 2
masky = mask // (w * by) % 2

連番maskを幅wで割ることでY座標を得ます。

0Like

Your answer might help someone💌