图像处理,使用openCV和numpy。尝试返回没有红色的图像

时间:2017-11-09 02:12:58

标签: python numpy opencv image-manipulation cv2

我正在尝试拍摄图像,如果其中有任何红色,则逐像素检查。

如果有,请用白色替换它。一旦它贯穿每个像素,它将返回一个白色而不是红色的新图像。

以下是我的尝试:

import cv2
import numpy as np

def take_out_red():
'''
Takes an image, and returns the same image with red replaced
by white
------------------------------------------------------------
Postconditions:
returns
new_img (no red) 
'''
img = cv2.imread('red.png',1)
#Reads the image#

new_img = img
#Makes a copy of the image
for i in range(499):
    for y in range(499):
        if np.all(img[i,y]) == np.all([0,0,253]):
            #[0,0,253] is a red pixel 
            #Supposed to check if the particular pixel is red
            new_img[i,y] == [255,255,255]
            #if it is red, it'll replace that pixel in the new_image
            #with a white pixel
return cv2.imshow('image',new_img)
#returns the new_image with no red 

任何帮助都将受到高度赞赏,非常感谢您提前。

2 个答案:

答案 0 :(得分:1)

如果您的服务有OpenCVnumpy,那么您可能不需要编写双重迭代for循环,这些循环也不干净且效率低下。这两个库都有非常有效的例程来迭代n-D数组并应用基本操作,例如检查相等性等。

您可以使用cv2.inRane()方法从输入图像中分割红色,然后使用强大的numpy使用从cv2.inRange()获得的蒙版替换颜色:

import cv2
import numpy as np

img = cv2.imread("./sample_img.png")

red_range_lower = np.array([0, 0, 240])
red_range_upper = np.array([0, 0, 255])
replacement_color = np.array([255, 0, 0])
red_mask = cv2.inRange(img, red_range_lower, red_range_upper)
img[red_mask == 255] = replacement_color

cv2.imwrite("./output.png", img)

输入:

enter image description here

输出:

enter image description here

答案 1 :(得分:0)

If img[i,y] == [0,0,255]:

是你的问题。你试图将两个值的东西与三个值进行比较,而且没有办法检查它。