03-圖像特效

一、灰度處理

方法一:imread方法

彩色圖的顏色通道為3,即RGB;而灰度圖只有一個顏色通道。

import cv2
img0 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)
img1 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
print(img0.shape)
print(img1.shape)cv2.imshow('src',img0)#灰度圖片
cv2.waitKey(0)

結果如下:
灰度圖像是沒有顏色通道的,彩色照片的顏色通道為3

方法二:cvtColor方法

顏色空間轉換
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
參數一:原始待轉換數據圖片
參數二:顏色轉換方式,BGR轉GRAY

import cv2
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#顏色空間轉換
cv2.imshow('dst',dst)#灰度圖片
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

方法三:灰度圖像==彩色圖像(R+G+B)/3

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度圖像的GBR都相等,為彩色照片的均值
dst1 = 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]gray = (int(b)+int(g)+int(r))/3dst1[i,j] = np.uint8(gray)cv2.imshow('dst1',dst1)#灰度圖片
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

方法四:灰度圖像==彩色圖像( R * 0.299+G * 0.587 + B * 0.114)

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度圖像的GBR都相等,為彩色照片的均值
dst2 = 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]gray = (int(b)*0.114+int(g)*0.587+int(r)*0.299)dst2[i,j] = np.uint8(gray)cv2.imshow('dst2',dst2)#灰度圖片
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

二、算法優化

1、定點計算比浮點計算快
2、加減運算比乘除運算快

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度圖像的GBR都相等,為彩色照片的均值
dst2 = 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]#gray = (int(b)*0.114+int(g)*0.587+int(r)*0.299)#gray = (int(b)+int(g)*2+int(r))/4#乘4除4gray = (r+(g<<1)+b)>>2#g乘2左移一位;除以4右移兩位dst2[i,j] = np.uint8(gray)cv2.imshow('dst2',dst2)#灰度圖片
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

三、顏色反轉

灰度圖像顏色反轉:0-255,即:255-當前值

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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)#這里只傳入一個顏色通道(height,width,1)當成灰度圖處理
for i in range(0,height):for j in range(0,width):grayPixel = gray[i,j]dst[i,j] = 255-grayPixelcv2.imshow('dst',dst)#灰度圖片
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述
彩色圖像的顏色反轉:RGB每個顏色通道的像素值都需要被255減去

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)#(height,width,1)一個像素值有三個顏色通道組成
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)

效果圖如下:
在這里插入圖片描述

四、圖片的馬賽克效果

馬賽克效果:定義馬賽克方塊,例如為10*10;將馬賽克方塊中的一個像素值去替代整個馬賽克方塊中的所有像素點

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for i in range(100,300):for j in range(100,200):if i%10 ==0 and j%10==0 :#定義一個10*10的馬賽克方塊,用馬賽克方塊中的一個去代替整個馬賽克的像素值for m in range(0,10):for n in range(0,10):(b,g,r) = img[i,j]img[m+i,n+j] = (b,g,r)cv2.imshow('dst',img)
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

五、圖片的毛玻璃效果

毛玻璃效果:定義毛玻璃方塊,例如為10*10;隨機生成一個像素點去依次代替毛玻璃方塊中的所有像素點

import cv2
import numpy as np
import random
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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)

效果圖如下:
在這里插入圖片描述

六、圖片的融合效果

采用每個圖片乘以一個比例系數然后相加進行融合的方式;兩張融合的圖片的大小必須一致
cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
參數一:圖片1
參數二:圖片1對應的權值
參數三:圖片2
參數四:圖片2對應的權值
參數五:偏移量,一般默認設置為0

import cv2
import numpy as np
img0 = cv2.imread('E:\Jupyter_workspace\study\data/water.png',1)#這兩張圖片必須大于第一張圖片的一半
img1 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]
#ROI選取一塊區域進行照片融合;且選取的大小必須比原圖像要小
roiH = int(height/2)
roiW = int(width/2)
img0ROI = img0[0:roiH,0:roiW]
img1ROI = img1[0:roiH,0:roiW]
#dst 定義目標圖片
dst = np.zeros((roiH,roiW,3),np.uint8)
dst = cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

七、邊緣檢測

邊緣檢測的實質就是圖像的卷積運算

調用Canny方法api實現邊緣檢測

canny邊緣檢測步驟:
1,對圖像先進行灰度處理
2,高斯濾波,除去圖像中一下噪聲的干擾
3,調用canny方法實現邊緣檢測

cv2.Canny(img,50,50)
參數一:傳入的圖片數據
參數二:如果圖片進行卷積運算之后大于該值,則認定為邊緣

import cv2
import numpy as np
import randomimg = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('img',img)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#1,轉換灰度圖像
imgG = cv2.GaussianBlur(gray,(3,3),0)#2,高斯濾波
dst = cv2.Canny(img,50,50)#3,調用Canny算法
cv2.imshow('dsr',dst)
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述
在這里插入圖片描述

使用sobel算子用源碼方式實現邊緣檢測

soble算子的算法原理:
1,算子的模板
水平方向模板:
1 2 1
0 0 0
-1 -2 -1
豎直方向模板:
1 0 -1
2 0 -2
1 0 -1
2,圖片卷積
矩陣卷積是矩陣對應的元素相乘然后再求和,并不是矩陣相乘!!!
例如:[1,2,3,4]為原像素,計算模板為[a,b,c,d],卷積之后結果為:dst = a1+b2+c3+d4
這個dst就是所謂的梯度,也分為水平方向gx和豎直方向gy
grad = sqrt(gxgx+gygy)
3,閾值判決
grad和閾值進行判斷

import cv2
import numpy as np
import random
import math
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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)#因為處理的是灰度圖片所以參數為1
for i in range(0,height-2):#因為矩陣是3*3的,矩陣右下角坐標為2,所以要-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]*1gx = gray[i,j]+gray[i+1,j]*2+gray[i+2,j]-gray[i,j+2]-gray[i+1,j+2]*2-gray[i+2,j+2]grad = math.sqrt(gx*gx+gy*gy)if grad>50:dst[i,j] = 255else:dst[i,j] = 0
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

八、圖片的浮雕效果

前一個像數值-后一個像數值+一個恒定的常量

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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-1):grayP0 = int(gray[i,j])#獲取當前的灰度值grayP1 = int(gray[i,j+1])#因為寬度+1了,所以j需要減一,否則會造成數組越界newP = grayP0-grayP1+150if newP>255:newP=255if newP<0:newP=0dst[i,j] = newP
cv2.imshow('dst',dst)
cv2.waitKey(0)

在這里插入圖片描述

九、顏色的映射變化改變圖片的顏色風格

偏藍風格:b1.5+g1.3

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',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.5g = g*1.3if b>255:b=255if g>255:g=255dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

十、圖片的油畫效果

實現步驟:
1、實現彩色到灰色照片的轉換
2、將圖片分割為若干個小方塊,統計這些小方塊中的每個像素值
3、將0-255的灰度值劃分為若干個等級,再把每個像素值映射到這些等級中
4、找到每個等級中含有像素最多的等級,并且求取這些像素的均值;從而實現每個小方塊中像素個數的統計
5、用統計出來的平均值來替代原來的像素值,最終實現油畫效果

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',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):#因為下面的循環是定義的小方塊大小為8*8for j in range(4,width-4):array1 = np.zeros(8,np.uint8)#定義的灰度等級為8個,這里定義一個數組裝載這8個等級for m in range(-4,4):for n in range(-4,4): p1 = int(gray[i+m,j+n]/32)array1[p1] = array1[p1]+1currentMax = array1[0]l = 0for 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)

效果圖如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378565.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378565.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378565.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解析linux根文件系統的掛載過程

------------------------------------------ 本文系本站原創,歡迎轉載!轉載請注明出處:http://ericxiao.cublog.cn/------------------------------------------ 一&#xff1a;前言前段時間在編譯kernel的時候發現rootfs掛載不上。相同的root選項設置舊版的image卻可以。為了…

SIFT講解(SIFT的特征點選取以及描述是重點)

目錄SIFT是什么&#xff1f;尺度空間理論SIFT特征點提取SIFT特征點描述SIFT是什么&#xff1f; SIFT ,即尺度不變特征變換( Scale-invariant feature transform&#xff0c;SIFT) ,一種特征描述方法。具有 尺度魯棒性 旋轉魯棒性 光照魯棒性 SIFT本身包括了特征點篩選及特征點…

操作系統多線程實現_操作系統中的線程實現

操作系統多線程實現Each process has an address space. There is one thread of control in every traditional OS. Sometimes, it is viable to have multiple threads of control in the similar address space which is running in quasi-parallel. Though they were separ…

mysql怎么消除冗余,mysql剔除冗余數據

mysql刪除冗余數據-- -- 1. 查詢冗余數據SELECT t.id FROM t_lifeservice_orders t WHERE t.orderStatus 2 GROUP BY t.channelCode, t.orderNum, t.orderStatus HAVING COUNT(t.orderStatus) > 1;-- -- 2. 定義刪除冗余數據存儲過程DROP PROCEDURE IF EXISTS proc_delete_…

04-圖像的形狀繪制

一、線段繪制 cv2.line(dst,(100,100),(400,400),(0,0,255),2,cv2.LINE_AA) 參數一&#xff1a;目標圖片數據 參數二&#xff1a;當前線段繪制的起始位置&#xff08;也就是兩點確定一條直線&#xff09; 參數三&#xff1a;當前線段繪制的終止位置&#xff08;也就是兩點確定…

(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的證明過程

問題出現&#xff1a;《數字信號處理第三版》第90頁劉順蘭版 最后一步怎么得到的&#xff1f; 思路&#xff1a;觀察答案&#xff0c;有一個自然對數項。關鍵就是如何提取出這一項。 我的證明過程如下&#xff1a; 參考鏈接&#xff1a; 【和差化積】

php 移植 arm 精簡,php5.4.5移植到arm-linux摘要,lighttpd配置

php5.4.5移植到arm-linux摘要.因為有嵌入WEB服務的需求&#xff0c;再常識了N多的開源的嵌入服務后最終選擇了lighttpd.Apache太大支了&#xff0c;而且在arm上對swf的支持不好.其他的都不怎么理想.lighttpd的移植過程就省略了。這里只摘要了PHP移植,采用fastcgi與lighttpd 協作…

05-圖像的美化

一、彩色圖片直方圖 cv2.calcHist([image],[0],None,[256],[0.0,255.0]) 該方法的所有參數都必須用中括號括起來&#xff01;&#xff01;&#xff01; 參數一&#xff1a;傳入的圖片數據 參數二&#xff1a;用于計算直方圖的通道&#xff0c;這里使用的是灰度直方圖&#xff…

java 檢查目錄是否存在_如何檢查Java目錄是否存在?

java 檢查目錄是否存在We are using the File class that is an abstract representation of file and directory path. To check if a directory exists we have to follow a few steps: 我們正在使用File類 &#xff0c;它是文件和目錄路徑的抽象表示。 要檢查目錄是否存在&a…

Eclipse for android 中設置java和xml代碼提示功能(轉)

1、設置 java 文件的代碼提示功能 打開 Eclipse 依次選擇 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java &#xff0c;設置框中默認是一個點&#xff0c; 現在將它改為&#xff1a; 以下為引用內容&#xff1a; .a…

MySQL 定時器EVENT學習

MySQL 定時器EVENT學習 MySQL從5.1開始支持event功能&#xff0c;類似oracle的job功能。有了這個功能之后我們就可以讓MySQL自動的執行數據匯總等功能&#xff0c;不用像以前需要操作的支持了。如linux crontab功能 。 創建測試表CREATE TABLE t( v VARCHAR(100) NOT NULL…

如何利用FFT(基2時間以及基2頻率)信號流圖求序列的DFT

直接用兩個例子作為模板說明&#xff1a; 利用基2時間抽取的FFT流圖計算序列的DFT 1、按照序列x[k]序號的偶奇分解為x[k]和x2[k]&#xff0c;即x1[k]{1,1,2,1}, x2[k]{-1,-1,1,2} 2、畫出信號流圖并同時進行計算 計算的時候需要參考基本蝶形單元&#xff1a; 關鍵在于 (WN) k…

matlab4.0,matlab?4.0

4.1fort-9:0.5:9if(t>0)y-(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);elsey(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);endend編譯結果&#xff1a;y248.00t-9.00y221.75t-8.50y197.00t-8.00y173.75t-7.50y152.00t-7.00y131.75t-6.50y113.00t-6.00y95.75t-5.50y80.00t-5.00y65.75t-4.50y…

圖形學 射線相交算法_計算機圖形學中的陰極射線管

圖形學 射線相交算法陰極射線管 (Cathode Ray Tube) Ferdinand Barun of Strasbourg developed the cathode ray tube in the year 1897. It used as an oscilloscope to view and measure some electrical signals. But several other technologies exist and solid state mov…

Constructor總結

一個類如果沒有構造那么系統為我們在背后創建一個0參數的構造&#xff0c;但是一旦我們創建了但參數的構造&#xff0c;那么默認的構造就沒了。 View Code 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace Console…

Python連接MySQL及一系列相關操作

一、首先需要安裝包pymysql(python3所對應) 我使用的是Anaconda全家桶&#xff0c;打開cmd&#xff0c;進入Anaconda下的Scripts文件夾下輸入命令&#xff1a;pip install pymysql進行下載安裝 二、我使用的編譯器為Anaconda所帶的Jupyter Notebook 1&#xff0c;在mysql中…

微機原理—可編程計數器/定時器8253概念詳解

目錄前言【1】定時處理方法1、定時的方法&#xff1a;2、定時和計數器【2】8253計數/定時器1、特點&#xff1a;2、芯片引腳以及電路&#xff1a;3、連接方式&#xff1a;4、工作原理&#xff1a;5、寄存器配置a、初始化操作&#xff08;三個通道單獨初始化&#xff09;b、讀出…

php靜態分析工具window,window_SpeedPHP框架核心調試工具,在日常的編程開發當中,開發 - phpStudy...

SpeedPHP框架核心調試工具在日常的編程開發當中&#xff0c;開發者經常會使用到對變量的調試&#xff0c;而sp框架提供的變量調試輸出函數——dump正好滿足了變量調試的需求。下面來介紹一下dump函數的使用方法。dump —— 變量格式化輸出函數用法&#xff1a;dump($vars, $out…

python 溫度轉換程序_Python程序將米轉換為碼

python 溫度轉換程序There are many problems where we have to calculate the distance in yards at the end but initially, the measurements are given in meters. So for such type of problems, the solution is converting the initial parameters into yards and then …

Oracle轉Sqlserver 記錄

使用了微軟的SSMA幫忙&#xff0c;但是目前只有表能幫忙轉&#xff0c;其他的還是要手動改&#xff0c;- - oracle 可以這樣查詢AppServiceInfoaspdb &#xff0c;調用其他庫的表。SQL是&#xff1a; aspdb.dob.AppServiceInfo si數據庫需要和 aspdb ASPDB_Capacity 在siinf…