web-dev-qa-db-ja.com

Python Opencv-画像のピクセル値を変更できません

以下の画像の白のピクセルを黒に、黒のピクセルを白に変更する必要がありますenter image description here

    import cv2

    img=cv2.imread("cvlogo.png")

背景が白で、画像のサイズを既知の固定サイズに変更した基本的なopencvロゴ

    img=cv2.resize(img, (300,300))#(width,height)


    row,col=0,0
    i=0

次に、forループを使用して各ピクセルを行と列の位置でチェックします

ピクセルが白の場合は黒に変更し、ピクセルが黒の場合は白に変更します。

    for row in range(0,300,1):
        print(row)
        for col in range(0,300,1):
            print(col)
            if img[row,col] is [255,255,255] : #I have used == instead of 'is'..but there is no change 
                img[row,col]=[0,0,0]
            Elif img[row,col] is [0,0,0]:
                img[row,col]=[255,255,255]

実行にエラーはありませんが、ピクセル値をそれぞれ黒または白に変更していません。さらに、ifステートメントも実行されていません。混乱が多すぎます。

    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

これは、この問題を解決する方法でもあります。クレジット:ajlaj25

    import cv2


    img=cv2.imread("cvlogo.png")
    img=cv2.resize(img, (300,300))
    height, width, channels = img.shape

    print(height,width,channels)

    for x in range(0,width):
        for y in range(0,height):
            if img[x,y,0] == 255 and img[x,y,1] == 255 and img[x,y,2] == 255:            
                img[x,y,0] = 0
                img[x,y,1] = 0
                img[x,y,2] = 0

            Elif img[x,y,0] == 0 and img[x,y,1] == 0 and img[x,y,2] == 0:
                img[x,y,0] = 255
                img[x,y,1] = 255
                img[x,y,2] = 255

img [x、y]はチャネル値を示します-3つすべて:[ch1、ch2、ch3] --x、y座標で。 img [x、y、0]は、x、y座標でのch1チャネルの値です。 ****

xとyは、ピクセルのRGB値ではなく、ピクセルの位置を示します。したがって、img [x、y、0]は、x、y座標でのch1チャネルの値です。

****

    cv2.imshow('Coverted Image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

これでうまくいくと思います。 :)(私は幅と高さの値を取得するためだけにnumpyを使用しました-これは必要ありません)

import cv2

img=cv2.imread("cvlogo.png")
img=cv2.resize(img, (300,300))
height, width, channels = img.shape

white = [255,255,255]
black = [0,0,0]

for x in range(0,width):
    for y in range(0,height):
        channels_xy = img[y,x]
        if all(channels_xy == white):    
            img[y,x] = black

        Elif all(channels_xy == black):
            img[y,x] = white

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1
ajlaj25

少し遅れましたが、この状況を解決するための別のアプローチで貢献したいと思います。私のアプローチは、画像のインデックス作成に基づいています。これは、受け入れ回答で使用されるアプローチとして画像をループするよりも高速です。

両方のコードを時間測定して、今言ったことを説明しました。以下のコードを見てください。

import cv2
from matplotlib import pyplot as plt

# Reading image to be used in the montage, this step is not important
original = cv2.imread('imgs/opencv.png')

# Starting time measurement
e1 = cv2.getTickCount()

# Reading the image
img = cv2.imread('imgs/opencv.png')

# Converting the image to grayscale
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Converting the grayscale image into a binary image to get the whole image
ret,imgBinAll = cv2.threshold(imgGray,175,255,cv2.THRESH_BINARY)

# Converting the grayscale image into a binary image to get the text
ret,imgBinText = cv2.threshold(imgGray,5,255,cv2.THRESH_BINARY)

# Changing white pixels from original image to black
img[imgBinAll == 255] = [0,0,0]

# Changing black pixels from original image to white
img[imgBinText == 0] = [255,255,255]

# Finishing time measurement
e2 = cv2.getTickCount()
t = (e2 - e1)/cv2.getTickFrequency()
print(f'Time spent in seconds: {t}')

次のステップはモンタージュをプロットすることなので、この時点でタイミングを停止しました。コードは次のとおりです。

# Plotting the image
plt.subplot(1,5,1),plt.imshow(original)
plt.title('original')
plt.xticks([]),plt.yticks([])
plt.subplot(1,5,2),plt.imshow(imgGray,'gray')
plt.title('grayscale')
plt.xticks([]),plt.yticks([])
plt.subplot(1,5,3),plt.imshow(imgBinAll,'gray')
plt.title('binary - all')
plt.xticks([]),plt.yticks([])
plt.subplot(1,5,4),plt.imshow(imgBinText,'gray')
plt.title('binary - text')
plt.xticks([]),plt.yticks([])
plt.subplot(1,5,5),plt.imshow(img,'gray')
plt.title('final result')
plt.xticks([]),plt.yticks([])
plt.show()

これが最終結果です。

提案されたアプローチのすべてのステップを示すモンタージュ

そして、これは消費された時間です(コンソールに印刷されます):

Time spent in seconds: 0.008526025

両方のアプローチを比較するために、画像のサイズが変更された行にコメントしました。また、imshowコマンドの前にタイミングを停止しました。結果は次のとおりです。

Time spent in seconds: 1.837972522

ループアプローチの最終結果

両方の画像を調べると、輪郭の違いがいくつかわかります。画像処理を行う場合、効率が重要になることがあります。したがって、可能な場合は時間を節約することをお勧めします。このアプローチは、さまざまな状況に適合させることができます。 しきい値のドキュメント を参照してください。

0
Paulo Araujo