Python中的OpenCV - 操作像素

时间:2015-03-18 22:00:36

标签: python opencv numpy

我使用python 2.7和OpenCV将图像设置为所有白色像素,但它无效。

这是我的代码:

import cv2
import numpy as np

image = cv2.imread("strawberry.jpg") #Load image

imageWidth = image.shape[1] #Get image width
imageHeight = image.shape[0] #Get image height

xPos = 0
yPos = 0

while xPos < imageWidth: #Loop through rows
    while yPos < imageHeight: #Loop through collumns

        image.itemset((xPos, yPos, 0), 255) #Set B to 255
        image.itemset((xPos, yPos, 1), 255) #Set G to 255
        image.itemset((xPos, yPos, 2), 255) #Set R to 255

        yPos = yPos + 1 #Increment Y position by 1
    xPos = xPos + 1 #Increment X position by 1

cv2.imwrite("result.bmp", image) #Write image to file

print "Done"

我使用numpy设置图像的像素 - 但result.bmp是原始图像的精确副本。

我做错了什么?

编辑:

我知道迭代像素是个坏主意,但是我的代码中没有功能的部分是什么?

2 个答案:

答案 0 :(得分:1)

使用opencv / python进行规则1:从不迭代像素,如果可以避免的话!

如果你想将所有像素设置为(1,2,3),它就像:

一样简单
image[::] = (1,2,3)

表示'全白':

image[::] = (255,255,255)

答案 1 :(得分:1)

除了@berak提出的有效建议外,如果这是你为了学习你想要使用的图书馆所写的代码,那你就犯了2个错误:

  1. 您忘记在内部while循环
  2. 之后重置yPos行索引计数器
  3. 您在xPos, yPos中切换了itemset的顺序。
  4. 我猜您的图片确实发生了变化,但它只在第一行显示,如果您不放大,则可能看不到。如果您更改这样的代码,它会起作用:< / p>

    import cv2
    import numpy as np
    
    image = cv2.imread("testimage.jpg") #Load image
    
    imageWidth = image.shape[1] #Get image width
    imageHeight = image.shape[0] #Get image height
    
    xPos, yPos = 0, 0
    
    while xPos < imageWidth: #Loop through rows
        while yPos < imageHeight: #Loop through collumns
    
            image.itemset((yPos, xPos, 0), 255) #Set B to 255
            image.itemset((yPos, xPos, 1), 255) #Set G to 255
            image.itemset((yPos, xPos, 2), 255) #Set R to 255
    
            yPos = yPos + 1 #Increment Y position by 1
    
        yPos = 0
        xPos = xPos + 1 #Increment X position by 1
    
    cv2.imwrite("result.bmp", image) #Write image to file
    

    请注意,我也不建议逐像素地迭代图像,如前所述。