画像へのアクセス

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)

特徴量+位置合わせ

画像位置合わせ:SIFTから深層学習まで - Qiita

OpenCV - 特徴点マッチングで物体検出、移動、回転量を推定する - pystyle

Pythonによる写真画像の位置合わせ | キャンプ工学

画像から特徴量を抽出し、透視変換行列を導出して画像を変形する - 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

組込みネット 初めてでも使えるVerilog HDL文法ガイド ―― 記述スタイル編|Tech Village (テックビレッジ) / CQ出版株式会社

マクニカセミナー資料 https://www.macnica.co.jp/business/semiconductor/articles/pdf/Verilog-HDL_Trial_Text_r1__1.pdf

マクニカテストベンチ記述 はじめてみよう!テストベンチ ~Verilog-HDL 編~ - 半導体事業 - マクニカ