【画像処理】PythonでOpenCVを使わずにラベリング処理 - Qiita
画像へのアクセス
Pythonのfor文でインデックスを同時に参照する:enumerate() | UX MILK
Python OpenCVの基礎 画素へのアクセス - Pythonの学習の過程とか
import numpy as np import cv2 #画像の読み込み img = cv2.imread('lena_gray.jpg',0) height,width = img.shape[:2] mask = np.zeros((width, height,3), np.uint8) for i, x in enumerate(img): for j,y in enumerate(x): if( img[i,j] < 50 ): mask[i,j]=0 else: if( img[i,j] > 150 ): mask[i,j]=0 else: mask[i,j]=255 for i, x in enumerate(img): for j,y in enumerate(x): if( img[i,j] < 50 ): img[i,j] = 0 else: if( img[i,j] > 150 ): img[i,j] = 255 cv2.imwrite('lena_pixchange.jpg',img) cv2.imwrite('lena_mask.jpg',mask)
特徴量+位置合わせ
OpenCV - 特徴点マッチングで物体検出、移動、回転量を推定する - pystyle
画像から特徴量を抽出し、透視変換行列を導出して画像を変形する - Qiita
ORB特徴量を用いて、ホモグラフィ変換を行う - Qiita
import cv2 import numpy as np MAX_FEATURES = 500 GOOD_MATCH_PERCENT = 0.15 def alignImages(im1, im2): # 特徴量の抽出と記述子の計算 detector = cv2.ORB_create(MAX_FEATURES) keypoints1, descriptors1 = detector.detectAndCompute(im1, None) keypoints2, descriptors2 = detector.detectAndCompute(im2, None) # 特徴量のマッチング matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) matches = matcher.match(descriptors1, descriptors2, None) print(matches) # 特徴量をスコアでソート ハミング距離などで定義可能 # matches.sort(key=lambda x: x.distance, reverse=False) matches = sorted(matches, key=lambda x: x.distance) # スコアのよい特徴量上位 N%を抽出 numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT) matches = matches[:numGoodMatches] # 特徴量マッチングの結果の描画 imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None) cv2.imwrite("matches.png", imMatches) # 特徴点と記述子の対応をとる points1 = np.zeros((len(matches), 2), dtype=np.float32) points2 = np.zeros((len(matches), 2), dtype=np.float32) for i, match in enumerate(matches): points1[i, :] = keypoints1[match.queryIdx].pt points2[i, :] = keypoints2[match.trainIdx].pt # 射影変換行列の算出と適用 h, mask = cv2.findHomography(points1, points2, cv2.RANSAC) height, width, channels = im2.shape im1Reg = cv2.warpPerspective(im1, h, (width, height)) return im1Reg #実行用 if __name__ == '__main__': # 画像補正のリファレンス # refFilename = "origin.png" refFilename = "lena.jpg" imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR) # 射影補正ターゲットの画像 # imFilename = "target.png" imFilename = "lena_copy.jpg" im = cv2.imread(imFilename, cv2.IMREAD_COLOR) # 射影変換の適用 imReg = alignImages(im, imReference) # 補正した画像の保存 outFilename = "aligned.png" cv2.imwrite(outFilename, imReg) imdiff = cv2.absdiff(imReference,imReg) cv2.imshow("diff",imdiff)
PySimpleGUI + opencv
import PySimpleGUI as sg import cv2 import numpy as np #opencv img_org = cv2.imread("Bus.jpg") img = cv2.imread("Bus.jpg") h, w = img.shape[:2] dx,dy,degree = 0.0, 0.0, 0.0 # セクション1 - オプションの設定と標準レイアウト sg.theme('Dark Blue 3') layout = [ [sg.Text('Python GUI')], [sg.Text("ファイル"), sg.InputText(), sg.FileBrowse(key="file1")], [sg.Text('角度', size=(15, 1)), sg.InputText(default_text='0.0',key="degree")], [sg.Text('Xshift', size=(15, 1)), sg.InputText(default_text='0.0',key="Xshift")], [sg.Text('Yshift', size=(15, 1)), sg.InputText(default_text='0.0',key="Yshift")], [sg.Submit(button_text='実行ボタン')], [sg.Submit(button_text='保存ボタン')] ] # セクション 2 - ウィンドウの生成 window = sg.Window('処理パラメータ入力', layout) # セクション 3 - イベントループ while True: event, values = window.read() if event is None: print('exit') break if event == '実行ボタン': print(values) show_message = "角度:" + values["degree"] + 'が入力されました。\n' show_message += "X:" + values["Xshift"] + 'が入力されました。\n' show_message += "Y:" + values["Yshift"] + "が入力されました。" print(show_message) degree = float(values["degree"]) dx =float(values["Xshift"]) dy =float(values["Yshift"]) #平行移動 afn_mat = np.float32([[1,0,dx],[0,1,dy]]) img_affine = cv2.warpAffine(img,afn_mat,(w,h)) #角度 rot_mat = cv2.getRotationMatrix2D((w/2,h/2),degree,1) img_affine = cv2.warpAffine(img_affine,rot_mat,(w,h)) #アルファブレンド alpha = 0.3 img_alpha = cv2.addWeighted(img_org, alpha, img_affine, 1 - alpha, 0) cv2.imshow("rotation",img_alpha) # ポップアップ sg.popup(show_message) if event == '保存ボタン': wfile='last_img_D'+values["degree"]+'_X'+values["Xshift"]+'_Y'+values["Yshift"]+'.tif' show_message=wfile+'を保存しました\n' print(show_message) cv2.imwrite(wfile,img) ''' #平行移動 #dx =float(values[1]) #dy =float(values[2]) afn_mat = np.float32([[1,0,dx],[0,1,dy]]) img = cv2.warpAffine(img,afn_mat,(w,h)) #角度 #degree = float(values[0]) rot_mat = cv2.getRotationMatrix2D((w/2,h/2),degree,1) img = cv2.warpAffine(img,rot_mat,(w,h)) cv2.imshow("rotation",img) ''' # セクション 4 - ウィンドウの破棄と終了 window.close()
verilog 練習1
module clkgen ( input wire clk, input wire reset_l, output reg clk_out ); parameter clk_counter_value = 4'b0100; reg [3:0] clk_counter;
always @(posedge clk or negedge reset_l) begin
if(!reset_l) begin
clk_counter <= 4'b0000;
end else if(clk_counter == clk_counter_value)begin
clk_counter <= 4'b0000;
end else begin
clk_counter <= clk_counter + 1;
end
end
always @(posedge clk or negedge reset_l) begin
if(!reset_l) begin
clk_out <= 4'b0000;
end else if(clk_counter == clk_counter_value) begin
clk_out <= ~clk_out;
end
end
endmodule
module clkgen_sim ();
//
reg reset_l_sig;
reg clk_sig;
//
clkgen clkgen(clk_sig,reset_l_sig,clk_out_sig);
//
initial begin
reset_l_sig <= 0;
#200
reset_l_sig <= 1;
#10000
$stop;
end
//
always begin
clk_sig <= 0;
#50;
clk_sig <= 1;
#50;
end
endmodule
vlog clkgen.v vlog clkgen_sim.v
vsim work.clkgen_sim
log -r *
add wave -position end sim:/clkgen_sim/clkgen/clk add wave -position end sim:/clkgen_sim/clkgen/clk_counter add wave -position end sim:/clkgen_sim/clkgen/clk_counter_value add wave -position end sim:/clkgen_sim/clkgen/clk_out add wave -position end sim:/clkgen_sim/clkgen/reset_l
run -all