From 7193cda5e3ee9b14483bb904c9859d1d4afa7771 Mon Sep 17 00:00:00 2001 From: Rajarshi Acharjee Date: Tue, 8 Aug 2023 11:52:25 +0530 Subject: [PATCH 1/8] Image Comparator Tool --- img_comparator_tool/README.md | 24 +++++++++++++ img_comparator_tool/image2.jpg | Bin 0 -> 6703 bytes img_comparator_tool/img_comparator_tool.py | 37 +++++++++++++++++++++ img_comparator_tool/python_img.jpg | Bin 0 -> 5333 bytes 4 files changed, 61 insertions(+) create mode 100644 img_comparator_tool/README.md create mode 100644 img_comparator_tool/image2.jpg create mode 100644 img_comparator_tool/img_comparator_tool.py create mode 100644 img_comparator_tool/python_img.jpg diff --git a/img_comparator_tool/README.md b/img_comparator_tool/README.md new file mode 100644 index 0000000..905691a --- /dev/null +++ b/img_comparator_tool/README.md @@ -0,0 +1,24 @@ +# Welcome to Image Comparator Tool +This is a tool for comparing two Images and getting their difference image as output
+ +# Version +1.0.0 + +# Motivation and Description +We.Contribute -> You.Levegage ; You.Contribute -> We.Leverage ; All -> Grow + +# Languages and Libraries used +Python and cv2
+ +Installation +==================== +Deploy the folder structure to the required location. + +Execution +==================== +Call python3 image_comparision.py. + +# FAQ +mail us - acharjeerishi99@gmail.com + + diff --git a/img_comparator_tool/image2.jpg b/img_comparator_tool/image2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0802358cd43fbf54be0ddb6ad7960ac97bb4ad5 GIT binary patch literal 6703 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 literal 0 HcmV?d00001 diff --git a/img_comparator_tool/img_comparator_tool.py b/img_comparator_tool/img_comparator_tool.py new file mode 100644 index 0000000..2c8a9af --- /dev/null +++ b/img_comparator_tool/img_comparator_tool.py @@ -0,0 +1,37 @@ +# This tool helps to compare two images and specifically colors the difference in red in the second image argument +import cv2 +def img_comparator(imPath1,imPath2): + img1 = cv2.imread(imPath1) + img2 = cv2.imread(imPath2) + + if img1 is None or img2 is None: + return "Images weren't loaded successfully!!" + + # resize the images to same dimension + img1 = cv2.resize(img1,(300,300)) + img2 = cv2.resize(img2,(300,300)) + + # calculating difference between two images + diff = cv2.subtract(img1,img2) + b,g,r = cv2.split(diff) + if cv2.countNonZero(b)==0 and cv2.countNonZero(g)==0 and cv2.countNonZero(r)==0: + return "The images are identical" + else: + # color the mask red + conv_hsv_gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) + ret, mask = cv2.threshold( + conv_hsv_gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU + ) + diff[mask != 255] = [0, 0, 255] + + # add the red mask to the images to spot the differences + img1[mask != 255] = [0, 0, 255] + img2[mask != 255] = [0, 0, 255] + + cv2.imwrite("difference.png", diff) + return "The images are different!!" + + +img1 = "python_img.jpg" +img2 = "image2.jpg" +print(img_comparator(img1,img2)) \ No newline at end of file diff --git a/img_comparator_tool/python_img.jpg b/img_comparator_tool/python_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce6fe65fbe7bcb1ef1c3875e2f7ef6ba55168e50 GIT binary patch literal 5333 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 NQru{`1VJum{|8~?bGQHi literal 0 HcmV?d00001 From 3af19bbf85beae9f48531fd4e1978aa1640735da Mon Sep 17 00:00:00 2001 From: Sourabh Jagtap Date: Thu, 26 Oct 2023 20:53:44 +0530 Subject: [PATCH 2/8] Create random_pwd_gen.py --- random_pwd_gen.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 random_pwd_gen.py diff --git a/random_pwd_gen.py b/random_pwd_gen.py new file mode 100644 index 0000000..f97a8e0 --- /dev/null +++ b/random_pwd_gen.py @@ -0,0 +1,23 @@ +# Generate Strong Random Passwords +import random +import string +# This script will generate an 18 character password +word_length = 18 +# Generate a list of letters, digits, and some punctuation +components = [string.ascii_letters, string.digits, "!@#$%&"] +# flatten the components into a list of characters +chars = [] +for clist in components: + for item in clist: + chars.append(item) +def generate_password(): + # Store the generated password + password = [] + # Choose a random item from 'chars' and add it to 'password' + for i in range(word_length): + rchar = random.choice(chars) + password.append(rchar) + # Return the composed password as a string + return "".join(password) +# Output generated password +print(generate_password()) From 4afe3b1d07ca85ff20c659e05eae06176a4072cf Mon Sep 17 00:00:00 2001 From: Sourabh Jagtap Date: Thu, 26 Oct 2023 20:55:48 +0530 Subject: [PATCH 3/8] Create extract_text_from_pdf.py --- extract_text_from_pdf.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 extract_text_from_pdf.py diff --git a/extract_text_from_pdf.py b/extract_text_from_pdf.py new file mode 100644 index 0000000..8cb13d0 --- /dev/null +++ b/extract_text_from_pdf.py @@ -0,0 +1,19 @@ +# import module PyPDF2 +import PyPDF2 +# put 'example.pdf' in working directory +# and open it in read binary mode +pdfFileObj = open('example.pdf', 'rb') +# call and store PdfFileReader +# object in pdfReader +pdfReader = PyPDF2.PdfFileReader(pdfFileObj) +# to print the total number of pages in pdf +# print(pdfReader.numPages) +# get specific page of pdf by passing +# number since it stores pages in list +# to access first page pass 0 +pageObj = pdfReader.getPage(0) +# extract the page object +# by extractText() function +texts = pageObj.extractText() +# print the extracted texts +print(texts) From 198221e479da65225c16af04cf3d458a8805435d Mon Sep 17 00:00:00 2001 From: Sourabh Jagtap Date: Thu, 26 Oct 2023 20:58:09 +0530 Subject: [PATCH 4/8] Create text_process_pandoc.py --- text_process_pandoc.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 text_process_pandoc.py diff --git a/text_process_pandoc.py b/text_process_pandoc.py new file mode 100644 index 0000000..e0067dc --- /dev/null +++ b/text_process_pandoc.py @@ -0,0 +1,4 @@ +import pandoc + +in_file = open("example.md", "r").read() +pandoc.write(in_file, file="example.pdf", format="pdf") From 713ff990ac27e34c13cb7b46409e556dc43b16be Mon Sep 17 00:00:00 2001 From: Sourabh Jagtap Date: Thu, 26 Oct 2023 20:59:13 +0530 Subject: [PATCH 5/8] Create filter_text.py --- filter_text.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 filter_text.py diff --git a/filter_text.py b/filter_text.py new file mode 100644 index 0000000..6c43112 --- /dev/null +++ b/filter_text.py @@ -0,0 +1,20 @@ +# Filter Text +# Import re module +import re +# Take any string data +string = """a string we are using to filter specific items. +perhaps we would like to match credit card numbers +mistakenly entered into the user input. 4444 3232 1010 8989 +and perhaps another? 9191 0232 9999 1111""" + +# Define the searching pattern +pattern = '(([0-9](\s+)?){4}){4}' + +# match the pattern with input value +found = re.search(pattern, string) +print(found) +# Print message based on the return value +if found: + print("Found a credit card number!") +else: + print("No credit card numbers present in input") From 0205a4b5653b699ea63d25a6ec4cafd511eade11 Mon Sep 17 00:00:00 2001 From: devansh83 Date: Thu, 26 Oct 2023 22:35:55 +0530 Subject: [PATCH 6/8] Added a cartooning filter --- Cartooning.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Cartooning.py diff --git a/Cartooning.py b/Cartooning.py new file mode 100644 index 0000000..4069afc --- /dev/null +++ b/Cartooning.py @@ -0,0 +1,61 @@ +import cv2 +import numpy as np +thresh1=0 +thresh2=0 + +def th1(value): + global thresh1 + thresh1=value +def th2(value): + global thresh2 + thresh2=value + +cam = cv2.VideoCapture(0) + +cv2.namedWindow("Track") +cv2.createTrackbar("Thresh1","Track",0,255,th1) +cv2.createTrackbar("thres2","Track",0,255,th2) +# const=0.5 +numDown=2 +numBilateral=2 + +def cartoonizing(frame): + # frame = cv2.resize(frame, (700,500)) + for i in range(numDown): + img = cv2.pyrDown(frame) + for _ in range(numBilateral): + img = cv2.bilateralFilter(img, 3, 3, 7) + for _ in range(numDown): + img = cv2.pyrUp(img) + + blur = cv2.resize(img,(700,500)) + cv2.imshow("Bilateral",blur) + gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) + blur = cv2.medianBlur(gray,3) + + canny = cv2.Canny(frame,thresh1,thresh2) + # canny = cv2.GaussianBlur(canny,(3,3),0) + thres,threshold = cv2.threshold(canny,150,255,cv2.THRESH_BINARY_INV) + # kernel = np.zeros((5, 5), np.uint8) + # threshold = cv2.dilate(threshold, kernel, iterations=1) + # threshold = cv2.GaussianBlur(threshold,(3,3),0) + + + (x,y,z) = img.shape + img_edge = cv2.resize(threshold,(y,x)) + img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) + # img_edge = cv2.GaussianBlur(img_edge,(3,3),0) + + cv2.imshow("Edges",threshold) + return cv2.bitwise_and(img,img_edge ) + +while True: + ignore,frame = cam.read() + frame = cv2.flip(frame,1) + frame = cv2.resize(frame, (700,500)) + end = cartoonizing(frame) + end = cv2.resize(end,(700,500)) + cv2.imshow("End",end) + if cv2.waitKey(1) & 0xff == ord('q'): + break +cam.release() From 46717ac657638e3dbcb2cb070088dcfa4e2752d5 Mon Sep 17 00:00:00 2001 From: devansh83 Date: Fri, 27 Oct 2023 19:14:25 +0530 Subject: [PATCH 7/8] Object Tracker based on HSV Values --- Tracking.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Tracking.py diff --git a/Tracking.py b/Tracking.py new file mode 100644 index 0000000..35373c8 --- /dev/null +++ b/Tracking.py @@ -0,0 +1,65 @@ +import cv2 +import numpy as np + +cam = cv2.VideoCapture(0) + +hueHigh = 0 +hueLow = 0 +satHigh = 0 +satLow = 0 +valHigh = 0 +valLow = 0 + +def hueh(val): + global hueHigh + hueHigh = val +def huel(val): + global hueLow + hueLow = val +def sath(val): + global satHigh + satHigh = val +def satl(val): + global satLow + satLow = val +def valh(val): + global valHigh + valHigh = val +def vall(val): + global valLow + valLow = val + +cv2.namedWindow('My frame') +cv2.createTrackbar('hueL','My frame',0,180,huel) +cv2.createTrackbar('hueH','My frame',0,180,hueh) + +cv2.createTrackbar('satL','My frame',0,255,satl) +cv2.createTrackbar('satH','My frame',0,255,sath) + +cv2.createTrackbar('valL','My frame',0,255,vall) +cv2.createTrackbar('valH','My frame',0,255,valh) + + +while True: + ignore,frame = cam.read() + frameHSV = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) + + lowerBound = np.array([hueLow,satLow,valLow]) + upperBound = np.array([hueHigh,satHigh,valHigh]) + + myMask = cv2.inRange(frameHSV,lowerBound,upperBound) + + contours,junk = cv2.findContours(myMask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) + for contour in contours: + area = cv2.contourArea(contour) + if area >=1000: + # cv2.drawContours(frame,[contour],0,(255,0,0),3) + x,y,w,h=cv2.boundingRect(contour) + cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3) + + mySelection = cv2.bitwise_and(frame,frame,mask=myMask) + cv2.imshow("My Selection",mySelection) + cv2.imshow("Frame",frame) + if cv2.waitKey(1) & 0xff == ord('q'): + break +cam.release() From 91e5429f281e2d7882f901b02471a400d2d22d8b Mon Sep 17 00:00:00 2001 From: devansh83 Date: Fri, 27 Oct 2023 19:28:19 +0530 Subject: [PATCH 8/8] Stitches 2 images together to create a single combined image --- ImageStiching.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 ImageStiching.py diff --git a/ImageStiching.py b/ImageStiching.py new file mode 100644 index 0000000..16df695 --- /dev/null +++ b/ImageStiching.py @@ -0,0 +1,121 @@ +import cv2 +import numpy as np + +img1 = input("Enter the path of the first image: ") +img2 = input("Enter the path of the second image: ") + +train = cv2.imread(r"{}".format(img1)) +query = cv2.imread(r"{}".format(img2)) +train_RGB = cv2.cvtColor(train,cv2.COLOR_BGR2RGB) +query_RGB = cv2.cvtColor(query,cv2.COLOR_BGR2RGB) +train_gray = cv2.cvtColor(train_RGB,cv2.COLOR_RGB2GRAY) +query_gray = cv2.cvtColor(query_RGB,cv2.COLOR_RGB2GRAY) + +query_gray = cv2.resize(query,(500,300)) +train_gray = cv2.resize(train,(500,300)) +query = cv2.resize(query,(500,300)) +train = cv2.resize(train,(500,300)) +feature_extraction_algo = 'sift' +feature_to_match = 'bf' + +def select_descriptor(image,method=None): + assert method is not None,"Please define a descriptor method. Accepted values are 'Sift','Surf','orb','brisk' " + + if method == 'sift': + descriptor = cv2.SIFT_create() + if method == 'surf': + descriptor = cv2.SURF_create() + if method == 'orb': + descriptor = cv2.ORB_create() + if method == 'brisk': + descriptor = cv2.BRISK_create() + (keypoints,features) = descriptor.detectAndCompute(image,None) + return (keypoints,features) + +keypoints_train,feature_train = select_descriptor(train_gray,feature_extraction_algo) +keypoints_query,feature_query = select_descriptor(query_gray,feature_extraction_algo) + +# print(keypoints_query) +# for keypoint in keypoints_query: +# x,y = keypoint.pt +# size = keypoint.size +# orientation = keypoint.angle +# response = keypoint.response +# octave = keypoint.octave +# class_id = keypoint.class_id +# print(x,y) +# cv2.imshow("Image1 ",cv2.drawKeypoints(train_gray,keypoints_train,None,color=(0,255,0))) +# cv2.imshow("Image2",cv2.drawKeypoints(query_gray,keypoints_query,None,color=(0,255,0))) # to draw key points +cv2.imshow("Image 1",train) +cv2.imshow("Image 2",query) + +def create_matching_object(method,crossCheck): + if method == 'sift' or method == 'surf': + bf = cv2.BFMatcher(cv2.NORM_L2,crossCheck=crossCheck) + if method == 'brisk' or method == 'orb': + bf = cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck==crossCheck) + + return bf + +def keypoints_matching(feature_train,feature_query,method): + bf = create_matching_object(method,True) + best_matches = bf.match(feature_train,feature_query) + raw_matches = sorted(best_matches,key = lambda x:x.distance) + print("Raw Matches with Brute Force",len(raw_matches)) + return raw_matches + +def keypoints_matching_knn(feature_train,feature_query,ratio,method): + bf = create_matching_object(method,False) + raw_matches = bf.knnMatch(feature_train,feature_query,k=2) + print("Raw Matches with Knn",len(raw_matches)) + + knn_matches=[] + for m,n in raw_matches: + if m.distance4: + points_train = np.float32([keypoints_train_image[m.queryIdx] for m in matches]) + points_query= np.float32([keypoints_query_image[m.trainIdx] for m in matches]) + + (H,status)=cv2.findHomography(points_train,points_query,cv2.RANSAC,reprojthreshhold) + return (matches,H,status) + + else: + return None + +M = homography_Stiching(keypoints_train,keypoints_query,4) +if M is None: + print('Error') +(matches,Homography_Matrix,status) = M +print(Homography_Matrix) +width = query.shape[1]+train.shape[1] +print(width) +height = max(query.shape[0],train.shape[0]) +print(height) + +result = cv2.warpPerspective(train,Homography_Matrix,(width,height)) +print(result) + +result[0:query.shape[0],0:query.shape[1]] = query + +cv2.imshow("Stich",result) +cv2.waitKey(0) +cv2.destroyAllWindows() \ No newline at end of file