Sei sulla pagina 1di 26

Laboratório de PDI

com Python/OpenCV
parte2
Prof. Stefano

Prof. Stefano
import cv2
# diferença entre soma opencv original
imagem = cv2.imread('imagens/med2.png')
imagem2=imagem
cv2.imshow('Imagem',imagem)
cv2.waitKey(0)

imagem3= imagem + imagem


cv2.imshow('Imagem3',imagem3) A+B
cv2.waitKey(0)

imagem4= cv2.add(imagem,imagem2)
cv2.imshow('Imagem4',imagem4)
cv2.waitKey(0)
cv2.add(A,B)
cv2.destroyAllWindows()

Prof. Stefano
Python
import cv2

imagem =
cv2.imread('imagens/caminhaoP.png')
imagem2=imagem
cv2.imshow('Imagem',imagem)
cv2.waitKey(0)

imagem3 = cv2.imread('imagens/fusca2.png')
cv2.imshow('Imagem3',imagem3)
cv2.waitKey(0)

#Image Blending –tem que ter o mesmo


tamanho
imagem4 =
cv2.addWeighted(imagem,0.7,imagem3,0.3,0)
cv2.imshow('Imagem4',imagem4)
cv2.waitKey(0)
3
cv2.destroyAllWindows()
Prof. Stefano
Python
import numpy as np
import cv2

img = cv2.imread('imagens/caminhao1.jpg')
cv2.imshow('Original', img)
largura = img.shape[1]
altura = img.shape[0]
#precisa calcular a proporcao
proporcao = float(altura/largura)
largura_nova = 320 #em pixels
altura_nova = int(largura_nova*proporcao)
tamanho_novo = (largura_nova, altura_nova)
#cv2.resize(imagem,novo tamanho, algoritmo para
#redimensionar Exercício: Da imagem
# o padrão é interpolação bilinear acima copie somente o
img_redimensionada = cv2.resize(img, carro do lado direito e
tamanho_novo) insira uma cópia com o
cv2.imshow('Resultado', img_redimensionada) dobro do tamanho ao lado
cv2.waitKey(0) do caminhão verde.
cv2.destroyAllWindows()

Prof. Stefano
Python
FLIP VERTICAL - HORIZONTAL

import cv2
img = cv2.imread('imagens/pista1.jpg')
Cv2.flip(imagem, FlipCode)
cv2.imshow("Original", img)
Flipcode:
flip_horizontal = cv2.flip(img, 1)
0 – vertical
cv2.imshow("Flip Horizontal", flip_horizontal)
+1 – horizontal
-1 - rotaciona 180
flip_vertical = cv2.flip(img, 0)
(Vertical+Horizontal)
cv2.imshow("Flip Vertical", flip_vertical)

flip_hv = cv2.flip(img, -1)


cv2.imshow("Flip Horizontal e Vertical",
flip_hv)
cv2.waitKey(0)

Prof. Stefano
Python

Prof. Stefano
Python
import cv2

img = cv2.imread('imagens/pista1.jpg')
(alt, lar) = img.shape[:2] #captura altura e largura
centro = (lar // 2, alt // 2) #acha o centro

cv2.imshow("Imagem original", img)


M = cv2.getRotationMatrix2D(centro, 30, 1.0)
#30 graus
img_rotacionada = cv2.warpAffine(img, M, (lar, alt))
cv2.imshow("Imagem rotacionada em 45 graus",
img_rotacionada)
cv2.waitKey(0)
cv2.destroyAllWindows()

getRotationMatrix2D
(centro,ângulo,escala)

Escala=4.0  7

Prof. Stefano
Python
from matplotlib import pyplot as plt
import cv2

img = cv2.imread('imagens/pista1.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#converte P&B
cv2.imshow("Imagem P&B", img)

#Função calcHist para calcular o histograma da imagem


h = cv2.calcHist([img], [0], None, [256], [0, 256])

plt.figure()
plt.title("Histograma P&B")
plt.xlabel("Intensidade")
plt.ylabel("Qtde de Pixels")
plt.plot(h)
plt.xlim([0, 256])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

Prof. Stefano
Python

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

Images = imagem
Channels = canais. (Tons cinza = [0], colorido=[0],[1] ou [2])
Mask = completa (None) ou por região
histSize =

Prof. Stefano
Python
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('imagens/pista1.jpg')
cv2.imshow("Imagem Colorida", img)

color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

10

Prof. Stefano
Python

Exercício:
Elabore um programa em
Python em que o programa
captura uma imagem com a
webcam (arquivo) e depois
de pressionar a tecla ESC
mostra o histograma
colorido e em tons de cinza
da imagem.

11

Prof. Stefano
Python
import cv2
# captura de frame da webcam
teste=True
cap = cv2.VideoCapture(0) Captura a imagem da
while(teste): webcam e mostra na
tela. Sai quando for
__, frame = cap.read() pressionado o ‘ q ’
cv2.imshow('rame', frame)
if cv2.waitKey(1) == ord('q'):
print('ok')
teste=False

cap.release() #desativa webcam


cv2.destroyAllWindows()

12

Prof. Stefano
Python
# Busca por cor

import cv2
import numpy as np
Captura a imagem na
# captura de frame da webcam
teste=True webcam para que ele
cap = cv2.VideoCapture(0) mostre uma cor, no caso
while(teste):
é o azul.
__, frame = cap.read()
hsv =cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

lower_blue=np.array([98,50,50])
upper_blue=np.array([130,255,255]) EXERCÍCIO
mask=cv2.inRange(hsv,lower_blue,upper_blue) Altere o programa para
que ele busque a cor
res=cv2.bitwise_and(frame,frame,mask=mask)
verde, vermelho, amarelo
cv2.imshow('frame', frame) e roxo, uma cor de cada
cv2.imshow('mask', mask) vez
cv2.imshow('res', res)

if cv2.waitKey(1) == ord('q'):
teste=False

cap.release() #desativa webcam


cv2.destroyAllWindows()
13

Prof. Stefano
Python
Tratamento de eventos com o Mouse

• Os eventos com o mouse são relativos a cada tela aberta, assim, somente quando o
mouse estiver sobre a tela é que eles são considerados;
• Diferentes telas são diferentes eventos, mesmo que com o mesmo mouse;
• Tratam-se os eventos para isso através de uma função específica.

def CallBackFunc(event, x, y, flags, param):

If event == cv2.EVENT_LBUTTONDOWN:
print("Left button of the mouse is clicked - position (", x, ", ",y, ")")

Python: cv2.setMouseCallback(windowName, onMouse[, param]) → None

14

Prof. Stefano
import cv2
import numpy as np Python
# Create a black image and a window
windowName = 'MouseCallback'
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow(windowName)

def CallBackFunc(event, x, y, flags, param):


if event == cv2.EVENT_LBUTTONDOWN:
print("Left button of the mouse is clicked - position (", x, ", ",y, ")")
elif event == cv2.EVENT_RBUTTONDOWN:
print("Right button of the mouse is clicked - position (", x, ", ", y, ")")
elif event == cv2.EVENT_MBUTTONDOWN:
print("Middle button of the mouse is clicked - position (", x, ", ", y, ")")
elif event == cv2.EVENT_MOUSEMOVE:
print("Mouse move over the window - position (", x, ", ", y, ")")
if flags == cv2.EVENT_FLAG_CTRLKEY + cv2.EVENT_FLAG_LBUTTON:
print("Left mouse button is clicked while pressing CTRL key - position (", x, ", ",y, ")")
elif flags == cv2.EVENT_FLAG_RBUTTON + cv2.EVENT_FLAG_SHIFTKEY:
print("Right mouse button is clicked while pressing SHIFT key - position (", x, ", ", y, ")")
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_ALTKEY:
print("Mouse is moved over the window while pressing ALT key - position (", x, ", ", y, ")")

# bind the callback function to window


cv2.setMouseCallback(windowName, CallBackFunc)

def main():
while (True):
cv2.imshow(windowName, img)
#cv2.waitKey(200)
if cv2.waitKey(20) == 27:
break

cv2.destroyAllWindows()
if __name__ == "__main__": 15
main()

Prof. Stefano
Python
import cv2
import numpy as np Equalização de histograma
from matplotlib import pyplot as plt

# captura de frame da webcam


teste=True

cap = cv2.VideoCapture(1)

while teste:
if cv2.waitKey(1) == ord('q'):
teste=False

__, frame = cap.read()


img =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('hsv', img)

equ = cv2.equalizeHist(img)
#res = np.hstack((img,equ)) #stacking images side-by-side
hist1 = cv2.calcHist([img],[0],None,[256],[0,256])
hist2 = cv2.calcHist([equ],[0],None,[256],[0,256])

plt.subplot(221), plt.imshow(img, 'gray')


plt.subplot(222), plt.plot(hist1)
plt.subplot(223), plt.imshow(equ, 'gray')
plt.subplot(224), plt.plot(hist2)
plt.xlim([0,256])
plt.show()

cv2.imshow('equ',equ)
cv2.waitKey(0)
cap.release() #desativa webcam 16
cv2.destroyAllWindows()

Prof. Stefano
Python

17

Prof. Stefano
Python

18

Prof. Stefano
Python

19

Prof. Stefano
Python
Exercícios:
a)Elabore um estudo da aplicação de equalização de histograma utilizando o programa
em python anterior a imagem em diferentes situações (Pelo menos 5. Ex. Estradas,
cidade, interior de casa, linha de produção, etc) e com diferentes condições de tempo
(Ex.: nevoeiro (Londres), penumbra, reflexo do sol intenso, etc). Em cada situação deverá
mostrar a imagem original, com seu histograma e a imagem otimizada com o seu
respectivo histograma. Deverá ser feito uma discussão geral sobre os resultados obtidos
analisando as melhores condições de aplicação, a resposta do algoritmo nas diferentes
situações, que deverá ser comprovado pelo conjunto de imagens selecionadas.

b) Aplique as mesmas considerações anteriores agora para imagens obtidas pela


webcam, fazendo a captura das imagens em diferentes ângulos de incidência de luz.
Nesse caso deverão ser selecionadas 3 situações que permitam controlar a luminosidade.

c) Desenvolva um programa em python para fazer a equalização de histograma com


imagens coloridas. Considere as mesmas situações dos itens a e b, mas com imagens
coloridas, e apresente as mesmas discussões.
20

Prof. Stefano
Python
# captura de frame da webcam
teste=True
cap = cv2.VideoCapture(1)

while teste: Binarização com a


if cv2.waitKey(1) == ord('q'): função thresholding
teste=False
(T, threshImage) = cv2.threshold(src, thresh, maxval, type)
__, frame = cap.read()
img =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('hsv', img)
src = imagem
thresh= limiar
ret,thresh1= cv2.threshold(img,127,255,cv2.THRESH_BINARY) maxval= valor atribuído ao pixel maior que thresh
ret,thresh2= cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) type= tipo de binarização
ret,thresh3= cv2.threshold(img,127,255,cv2.THRESH_TRUNC) T = valor utilizado na binarização(muda qdo usa Otsu)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']


images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()
cap.release() #desativa webcam
cv2.destroyAllWindows() 21

Prof. Stefano
Python

22

Prof. Stefano
Python
Imagem do computador

23

Prof. Stefano
Python
A mesma imagem anterior adquirida com a webcam de uma folha impressa com
a influência da luz

24

Prof. Stefano
Python
Exercícios:
a) Elabore um programa em python que demostre a utilização da binarização em uma
aplicação prática ( peças em linha de produção, moedas, médica (células), agricultura
(folhas - frutas) )utilizando imagens retiradas da internet(pelo menos 5 diferentes). Para
isso o programa deverá mostrar a imagem original e mostrar o seu histograma e depois
aplicar a binarização em 3 níveis de intensidade diferentes. Deverá ser feito uma
discussão geral sobre os resultados obtidos analisando as melhores condições de
aplicação (níveis selecionados) e a relação com o fundo da imagem.

b) Aplique as mesmas considerações anteriores agora para imagens (5 imagens) obtidas


pela webcam, fazendo a captura das imagens em diferentes ângulos de incidência de luz.
Nesse caso deverão ser selecionadas 3 situações que permitam controlar a luminosidade.

25

Prof. Stefano
Referências

• Notas de aula prof. Stefano


• http://www.galirows.com.br/meublog/opencv-python/
• https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
• https://docs.python.org/3/tutorial/
• https://www.w3schools.com/
• https://www.programiz.com/
• http://www.learnpython.org/
• https://panda.ime.usp.br/aulasPython/static/aulasPython/index.html
• https://www.pycursos.com/python-para-zumbis/
• https://www.youtube.com/playlist?list=PLHz_AreHm4dksnH2jVTIVNviIMBVYyFnH
• https://pysource.com/
• https://www.learnopencv.com/
• https://www.edureka.co/blog/python-opencv-tutorial/
• https://codewords.recurse.com/issues/six/image-processing-101
• https://www.intorobotics.com/how-to-detect-and-track-object-with-opencv/
• https://realpython.com/
• https://www.pyimagesearch.com
• https://lmcaraig.com/image-histograms-histograms-equalization-and-histograms-comparison/
• https://pysource.com/2018/01/20/loading-images-opencv-3-4-with-python-3-tutorial-1/
26

Prof. Stefano