Як залити зображення OpenCV одним суцільним кольором?


Відповіді:


99

Використання OpenCV C API з IplImage* img:

Використовуйте cvSet () :cvSet(img, CV_RGB(redVal,greenVal,blueVal));

Використовуючи OpenCV C ++ API з cv::Mat img, потім використовуйте:

cv::Mat::operator=(const Scalar& s) як і в:

img = cv::Scalar(redVal,greenVal,blueVal);

або більш загально, підтримка маскиcv::Mat::setTo() :

img.setTo(cv::Scalar(redVal,greenVal,blueVal));

4
Це має бути червоний, зелений, синій АБО синій, зелений, червоний? Хіба це не синій, зелений, червоний у opencv?
ПК

16
Це синій, зелений, червоний. Підтверджено
Несподіваний

4
Насправді OpenCV є агностиком щодо порядку каналів. Ви праві, що найпоширеніший порядок каналів (на ПК), BGRоднак, це не надто доречно для цієї відповіді. Зазвичай користувач несе відповідальність за відстеження порядку замовлення каналів.
Аді Шавіт,

@AdiShavit чи можемо ми видалити встановлений колір із картинки?
Shwetabh Shekhar

2
@ShwetabhShekhar: Це запитання має стільки різних значень і відповідей, що воно далеко виходить за рамки коментаря ... Спробуйте поставити його як повне запитання та надайте більше контексту тому, що ви хочете зробити. Але, відповідаючи спрощено, що ви маєте на увазі під "видаленням" триплету значень із існуючого масиву С?
Аді Шавіт

37

Ось як це зробити з cv2 в Python:

# Create a blank 300x300 black image
image = np.zeros((300, 300, 3), np.uint8)
# Fill image with red color(set each pixel to red)
image[:] = (0, 0, 255)

Ось більш повний приклад створення нового порожнього зображення, заповненого певним кольором RGB

import cv2
import numpy as np

def create_blank(width, height, rgb_color=(0, 0, 0)):
    """Create new image(numpy array) filled with certain color in RGB"""
    # Create black blank image
    image = np.zeros((height, width, 3), np.uint8)

    # Since OpenCV uses BGR, convert the color first
    color = tuple(reversed(rgb_color))
    # Fill image with color
    image[:] = color

    return image

# Create new blank 300x300 red image
width, height = 300, 300

red = (255, 0, 0)
image = create_blank(width, height, rgb_color=red)
cv2.imwrite('red.jpg', image)

10

Найпростішим є використання класу OpenCV Mat:

img=cv::Scalar(blue_value, green_value, red_value);

де imgбуло визначено як a cv::Mat.


7

Створіть нове зображення 640x480 та заповніть його фіолетовим (червоним + синім):

cv::Mat mat(480, 640, CV_8UC3, cv::Scalar(255,0,255));

Примітка:

  • висота перед шириною
  • тип CV_8UC3 означає 8-бітний непідписаний int, 3 канали
  • кольоровий формат - BGR

6

Для 8-бітного (CV_8U) зображення OpenCV синтаксис:

Mat img(Mat(nHeight, nWidth, CV_8U);
img = cv::Scalar(50);    // or the desired uint8_t value from 0-255

5

Використовуйте numpy.full. Ось Python, який створює сіре, синє, зелене та червоне зображення і відображається у сітці 2x2.

import cv2
import numpy as np

gray_img = np.full((100, 100, 3), 127, np.uint8)

blue_img = np.full((100, 100, 3), 0, np.uint8)
green_img = np.full((100, 100, 3), 0, np.uint8)
red_img = np.full((100, 100, 3), 0, np.uint8)

full_layer = np.full((100, 100), 255, np.uint8)

# OpenCV goes in blue, green, red order
blue_img[:, :, 0] = full_layer
green_img[:, :, 1] = full_layer
red_img[:, :, 2] = full_layer

cv2.imshow('2x2_grid', np.vstack([
    np.hstack([gray_img, blue_img]), 
    np.hstack([green_img, red_img])
]))
cv2.waitKey(0)
cv2.destroyWindow('2x2_grid')

Як би ви зробили це з не-сірим кольором?
Alecg_O

Оновлено не сірим прикладом.
orangepips 02

4

Якщо ви використовуєте Java для OpenCV, ви можете використовувати наступний код.

Mat img = src.clone(); //Clone from the original image
img.setTo(new Scalar(255,255,255)); //This sets the whole image to white, it is R,G,B value

0

Я особисто створив цей код python, щоб змінити колір цілого зображення, відкритого або створеного за допомогою openCV. Мені шкода, якщо це недостатньо добре, я новачок 😚😚.

def OpenCvImgColorChanger(img,blue = 0,green = 0,red = 0):
line = 1
ImgColumn = int(img.shape[0])-2
ImgRaw  = int(img.shape[1])-2



for j in range(ImgColumn):

    for i in range(ImgRaw):

        if i == ImgRaw-1:
            line +=1

        img[line][i][2] = int(red)
        img[line][i][1] = int(green)
        img[line][i][0] = int(blue)

1
Ласкаво просимо до SO! Коли ви збираєтеся відповісти на старе запитання (цьому вже майже 10 років), яке вже має прийняту відповідь (саме тут так), будь ласка, запитайте себе: чи справді я можу запропонувати істотне покращення? Якщо ні, будь ласка, утримайтеся від відповіді.
Тимус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.