Компьютерное зрение - Эффекты изображения (3)

Python компьютерное зрение OpenCV
Компьютерное зрение - Эффекты изображения (3)

1. Обработка оттенков серого

(1) imread (src,0)

#imread 
import cv2
img0 = cv2.imread('canton.jpg',0)
img1 = cv2.imread('canton.jpg',1)
print(img0.shape)
print(img1.shape)
cv2.imshow('src',img0)
cv2.imshow('src',img1)
cv2.waitKey(0)

(2) cvtColor()

Преобразование изображения из одного цветового пространства в другое.

Эта функция преобразует входное изображение из одного цветового пространства в другое. Если вы конвертируете цветовое пространство RGB, вы должны явно указать порядок каналов (RGB или BGR). Обратите внимание, что формат цвета по умолчанию в OpenCV часто называют RGB, но на самом деле это BGR (байты напротив). Таким образом, первый байт в стандартном (24-битном) цветном изображении будет 8-битным синим компонентом, второй байт будет зеленым, а третий байт будет красным. Четвертый, пятый и шестой байты станут вторым пикселем (синим, затем зеленым, затем красным) и так далее.

cv::cvtColor() поддерживает преобразование между несколькими цветовыми пространствами.Поддерживаемые типы преобразования и коды преобразования:

1. Преобразование цветового пространства RGB и BGR (цветовое пространство цветного изображения opencv по умолчанию — BGR).

cv::COLOR_BGR2RGB cv::COLOR_RGB2BGR cv::COLOR_RGBA2BGRA cv::COLOR_BGRA2RGBA

2. Добавьте альфа-канал к изображениям RGB и BGR.

cv::COLOR_RGB2RGBA cv::COLOR_BGR2BGRA

3. Удалите альфа-канал из изображений RGB и BGR.

cv::COLOR_RGBA2RGB cv::COLOR_BGRA2BGR

4. Преобразование из цветового пространства RBG и BGR в пространство в оттенках серого.

cv::COLOR_RGB2GRAY cv::COLOR_BGR2GRAY

cv::COLOR_RGBA2GRAY

cv::COLOR_BGRA2GRAY

5. Преобразование из пространства оттенков серого в цветовое пространство RGB и BGR.

cv::COLOR_GRAY2RGB cv::COLOR_GRAY2BGR

cv::COLOR_GRAY2RGBA cv::COLOR_GRAY2BGRA

6. Преобразование между цветовыми пространствами RGB и BGR и цветовым пространством BGR565.

cv::COLOR_RGB2BGR565 cv::COLOR_BGR2BGR565 cv::COLOR_BGR5652RGB cv::COLOR_BGR5652BGR cv::COLOR_RGBA2BGR565 cv::COLOR_BGRA2BGR565 cv::COLOR_BGR5652RGBA cv::COLOR_BGR5652BGRA

7. Преобразование между доменом серого пространства BGR565

cv::COLOR_GRAY2BGR555 cv::COLOR_BGR5552GRAY

8. Преобразование между цветовыми пространствами RGB и BGR и CIE XYZ

cv::COLOR_RGB2XYZ cv::COLOR_BGR2XYZ cv::COLOR_XYZ2RGB cv::COLOR_XYZ2BGR

9. Преобразование между цветовыми пространствами RGB и BGR и цветностью uma (пространство YCrCb)

cv::COLOR_RGB2YCrCb cv::COLOR_BGR2YCrCb cv::COLOR_YCrCb2RGB cv::COLOR_YCrCb2BGR

10. Взаимное преобразование между цветовыми пространствами RGB и BGR и цветовым пространством HSV.

cv::COLOR_RGB2HSV

cv::COLOR_BGR2HSV

cv::COLOR_HSV2RGB

cv::COLOR_HSV2BGR

11. Взаимопреобразование между цветовыми пространствами RGB и BGR и цветовыми пространствами HLS.

cv::COLOR_RGB2HLS cv::COLOR_BGR2HLS cv::COLOR_HLS2RGB cv::COLOR_HLS2BGR

12. Взаимное преобразование между цветовыми пространствами RGB и BGR и цветовым пространством CIE Lab.

cv::COLOR_RGB2Lab cv::COLOR_BGR2Lab cv::COLOR_Lab2RGB cv::COLOR_Lab2BGR

13. Преобразование между цветовыми пространствами RGB и BGR и цветовым пространством CIE Luv.

cv::COLOR_RGB2Luv cv::COLOR_BGR2Luv cv::COLOR_Luv2RGB cv::COLOR_Luv2BGR

14. Преобразование формата Байера (необработанные данные) в цветовое пространство RGB или BGR.

cv::COLOR_BayerBG2RGB

cv::COLOR_BayerGB2RGB

cv::COLOR_BayerRG2RGB

cv::COLOR_BayerGR2RGB

cv::COLOR_BayerBG2BGR

cv::COLOR_BayerGB2BGR

cv::COLOR_BayerRG2BGR

cv::COLOR_BayerGR2BGR

cvtColor(

  • InputArray Входное изображение: 8-битное беззнаковое, 16-битное беззнаковое (CV_16UC...) или с плавающей запятой одинарной точности. ,
  • OutputArray выводит изображение того же размера и глубины, что и src. ,
  • код преобразования цветового пространства INT,
  • INT Количество каналов в целевом изображении; если параметр равен 0, количество каналов автоматически выводится из src и кода. )
import cv2
img = cv2.imread('canton.jpg',1)
dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('dst',dst)
cv2.waitKey(0)

(3) np.uint8()

import cv2
import numpy as np
img = cv2.imread('canton.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        b = int(b)
        g = int(g)
        r = int(r)
        gray = r*0.2+g*0.5+b*0.2
        dst[i,j] = np.uint8(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

2. Переворот цвета

(1) переворот серого цвета изображения

import cv2
import numpy as np
img = cv2.imread('canton.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = np.zeros((height,width,1),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        grayPixel = gray[i,j]
        dst[i,j] = 255-grayPixel
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

(2) Переворот цвета цветного изображения

import cv2
import numpy as np
img = cv2.imread('canton.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        dst[i,j] = (255-b,255-g,255-r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

3. Эффект мозаики

import cv2
import numpy as np
img = cv2.imread('cantontower.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for m in range(0,600):
    for n in range(300,600):
        # pixel ->10*10
        if m%10 == 0 and n%10==0:
            for i in range(0,10):
                for j in range(0,10):
                    (b,g,r) = img[m,n]
                    img[i+m,j+n] = (b,g,r)
cv2.imshow('dst',img)
cv2.waitKey(0)

результат:

Четыре, эффект матового стекла

import cv2
import numpy as np
import random
img = cv2.imread('cantontower.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
mm = 8
for m in range(0,height-mm):
    for n in range(0,width-mm):
        index = int(random.random()*8)#0-8
        (b,g,r) = img[m+index,n+index]
        dst[m,n] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

5. Слияние изображений

(1) добавить взвешенный()

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])

  • параметр
  • src1 Ссылка на изображение 1
  • альфа - это прозрачность src1
  • src2 Ссылка на изображение 2
  • бета - это прозрачность src2
  • gamma Скалярное значение, добавляемое к сумме весов, dst = src1 * alpha + src2 * beta + gamma;
  • dtype Необязательная глубина выходного массива со значением по умолчанию -1. ; Когда два входных массива имеют одинаковую глубину, этот параметр устанавливается равным -1 (по умолчанию), т. е. эквивалентен src1.depth()
import cv2
import numpy as np
img0 = cv2.imread('cantontower.jpg',1)
img1 = cv2.imread('qilou.jpg',1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]

roiH = int(height/2)
roiW = int(width/2)
img0ROI = img0[0:roiH,0:roiW]
img1ROI = img1[0:roiH,0:roiW]

dst = np.zeros((roiH,roiW,3),np.uint8)
dst = cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
# dst = src1 * alpha + src2 * beta + gamma;

cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

6. Обнаружение края

(1) Размытие по Гауссу()

GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

параметр

  • src, входное изображение, то есть исходное изображение, заполните объектом класса Mat. Это может быть одно изображение с любым количеством каналов, но следует отметить, что глубина изображения должна быть одной из CV_8U, CV_16U, CV_16S, CV_32F и CV_64F.
  • dst, целевое изображение, должно быть того же размера и типа, что и исходное изображение. Например, Mat::Clone можно использовать для инициализации целевого изображения исходным изображением в качестве шаблона.
  • ksize, размер ядра Гаусса. Где ksize.width и ksize.height могут быть разными, но должны быть положительными и нечетными (и я не могу понять). В качестве альтернативы они могут быть нулевыми, и все они вычисляются из сигмы.
  • sigmaX, которое представляет собой стандартное отклонение функции ядра Гаусса в направлении X.
  • sigmaY, стандартное отклонение функции ядра Гаусса в направлении Y. Если sigmaY равно нулю, оно устанавливается равным sigmaX, если и sigmaX, и sigmaY равны 0, то оно вычисляется из ksize.width и ksize.height. Ради корректности результата лучше всего указать все третий параметр Size, четвертый параметр sigmaX и пятый параметр sigmaY.
  • borderType, который используется для вывода некоторого шаблона границы для пикселей за пределами изображения. Обратите внимание, что по умолчанию он имеет значение BORDER_DEFAULT.

(2) Осторожный ()

Canny(InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize = 3,bool L2gradient = false )

параметр

  • image Введите 8-битное изображение.
  • Edges выводит карту ребер, одноканальное 8-битное изображение того же размера, что и изображение.
  • threshold1 Первый порог программы гистерезиса.
  • threshold2 Второй порог для программы гистерезиса.
  • апертураSize Размер апертуры оператора Собеля.
  • L2gradient Флаг, указывающий, существует ли более точная норма L2 =(dI/dx)2+(dI/dy)2 или норма L1 по умолчанию =|dI/dx|+|dI/dy| ( L2gradient=false )
import cv2
import numpy as np
import random
img = cv2.imread('cantontower.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgG = cv2.GaussianBlur(gray,(3,3),0)
dst = cv2.Canny(img,50,50)
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

(3) Принцип обнаружения краев

Края — это границы областей изображения, где оттенки серого резко меняются. Изменение уровня серого изображения может быть представлено градиентом распределения уровня серого изображения.В цифровых изображениях вывод выполняется с использованием дифференциального приближенного дифференцирования.На самом деле, пространственный дифференциальный оператор часто используется для завершения свертки.

Оператор Собеля представляет собой комбинацию гауссовского сглаживания и дифференциальных операций. Поэтому его антишумовая способность очень сильна и имеет множество применений. Общий оператор Собеля включает направления x и y, а шаблон оператора:

В функции opencv также можно установить размер ядра свертки (ksize).Предполагая, что ksize=-1, он превращается в оператор Шарра 3*3, а шаблон представляет собой не что иное, как измененное число:

import cv2
import numpy as np
import random
import math
img = cv2.imread('cantontower.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = np.zeros((height,width,1),np.uint8)
for i in range(0,height-2):
    for j in range(0,width-2):
        gy = -gray[i,j]*1-gray[i,j+1]*2-gray[i,j+2]*1+gray[i+2,j]*1+gray[i+2,j+1]*2+gray[i+2,j+2]*1
        gx = -gray[i,j]*1+gray[i+2,j]*1-gray[i,j+1]*2+gray[i+2,j+1]*2-gray[i,j+2]*1+gray[i+2,j+2]*1
        grad = math.sqrt(gx*gx+gy*gy)
        if grad>50:
            dst[i,j] = 255
        else:
            dst[i,j] = 0
cv2.imshow('dst',dst)
cv2.waitKey(0)

7. Функция тиснения

import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# newP = gray0-gray1+150
dst = np.zeros((height,width,1),np.uint8)
for i in range(0,height):
    for j in range(0,width-1):
        grayP0 = int(gray[i,j])
        grayP1 = int(gray[i,j+1])
        newP = grayP0-grayP1+150
        if newP > 255:
            newP = 255
        if newP < 0:
            newP = 0
        dst[i,j] = newP
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

Семь, цветовой стиль

import cv2
import numpy as np
img = cv2.imread('cantontower.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

dst = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        b = b*1.5
        g = g*1.3
        r = r
        if b>255:
            b = 255
        if g>255:
            g = 255
        if r>255:
            r = 255
        dst[i,j]=(b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат:

Восемь, спецэффекты масляной живописи

import cv2
import numpy as np
img = cv2.imread('image00.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = np.zeros((height,width,3),np.uint8)
for i in range(4,height-4):
    for j in range(4,width-4):
        array1 = np.zeros(8,np.uint8)
        for m in range(-4,4):
            for n in range(-4,4):
                p1 = int(gray[i+m,j+n]/32)
                array1[p1] = array1[p1]+1
        currentMax = array1[0]
        l = 0
        for k in range(0,8):
            if currentMax<array1[k]:
                currentMax = array1[k]
                l = k
        for m in range(-4,4):
            for n in range(-4,4):
                if gray[i+m,j+n]>=(l*32) and gray[i+m,j+n]<=((l+1)*32):
                    (b,g,r) = img[i+m,j+n]
        dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

результат: