Search Returned...
|
Dungeness Crab With Kelp
Wednesday, October 8th, 2025 at 22:58:31 Dungeness Crab With Kelp John Harvey Photo > Blogs for 2025 to 2005 > June 2025 > Dungeness Crab With Kelp
|
|
|
Im Traumatized
Wednesday, October 8th, 2025 at 21:43:22 Im Traumatized John Harvey Photo > Blogs for 2025 to 2005 > August 2025 > Im Traumatized
|
|
|
Coopers Hawk
Sunday, October 5th, 2025 at 18:47:20 Coopers Hawk John Harvey Photo > Blogs for 2025 to 2005 > August 2025 > Coopers Hawk
|
|
|
Porteau Cove
Tuesday, September 30th, 2025 at 20:06:41 This is a series of 500 images, taken from 3:27pm to 4:01. The interval is 4 seconds and the exposure on the bottom is 1/60th of a second. I think I basically landed on the starfish which is why it starts moving immediately. John Harvey Photo > Blogs for 2025 to 2005 > May 2025 > Porteau Cove
|
|
|
Near Granville Island
Tuesday, September 30th, 2025 at 20:06:40 The shot was 408 frames long, starting at 11:56am and finishing at 12:23pm. This is a timelapse of 48 images showing the parts that aren't boring. The interval is 4 seconds. Exposure is roughly 1/10th of a second. John Harvey Photo > Blogs for 2025 to 2005 > May 2025 > Near Granville Island
|
|
|
Green Anenome Closing
Tuesday, September 30th, 2025 at 17:03:50 Green Anenome Closing Species: Anthopleura xanthogrammica (giant green anemone)
John Harvey Photo > Blogs for 2025 to 2005 > Tofino 2025 > Green Anenome Closing
|
|
|
Kelp Crabs Being Crabs
Tuesday, September 30th, 2025 at 17:03:50 Kelp Crabs Being Crabs John Harvey Photo > Blogs for 2025 to 2005 > Tofino 2025 > Kelp Crabs Being Crabs
|
|
|
Sunset At Mackenzie Beach
Tuesday, September 30th, 2025 at 17:03:50 Sunset At Mackenzie Beach John Harvey Photo > Blogs for 2025 to 2005 > Tofino 2025 > Sunset At Mackenzie Beach
|
|
|
Sunset From Radar Hill
Tuesday, September 30th, 2025 at 17:03:50 Sunset From Radar Hill John Harvey Photo > Blogs for 2025 to 2005 > Tofino 2025 > Sunset From Radar Hill
|
|
|
Last Of Cherry Blossums
Thursday, August 14th, 2025 at 22:16:38 Last Of Cherry Blossums John Harvey Photo > Blogs for 2025 to 2005 > April 2025 > Last Of Cherry Blossums
|
|
|
Sunset Fireworks
Tuesday, August 12th, 2025 at 16:13:29 This is shot from the Burrard Street Bridge. John Harvey Photo > Blogs for 2025 to 2005 > July 2025 > Sunset Fireworks
|
|
|
Thick Horned Nudibranch Video
Saturday, July 19th, 2025 at 08:43:09 Thick Horned Nudibranch Video John Harvey Photo > Blogs for 2025 to 2005 > April 2022 > Thick Horned Nudibranch Video
|
|
|
Bottom Of Porteau Cove
Monday, June 9th, 2025 at 22:13:33 Bottom Of Porteau Cove John Harvey Photo > Blogs for 2025 to 2005 > May 2025 > Bottom Of Porteau Cove
|
|
|
Nara At Petting Zoo 2
Tuesday, June 3rd, 2025 at 23:23:10 Nara At Petting Zoo 2 Tags: petting zoo
People: Nara
John Harvey Photo > Blogs for 2025 to 2005 > August 2011 > Nara At Petting Zoo 2
|
|
|
Ogden Snails
Tuesday, May 13th, 2025 at 21:02:42 This is 44 frames. Exposure is about 1/4 of a second per frame. Total Duration is about 7 minutes. The camera is moving almost every frame. Stabilization was done with photoshop layers. John Harvey Photo > Blogs for 2025 to 2005 > April 2025 > Ogden Snails
|
|
|
Ogden Point Urchins
Tuesday, May 13th, 2025 at 21:02:42 This is 66 images. Stabilization was done with a python script:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pprint
import math
# /opt/homebrew/bin/ffmpeg -framerate 30 -pattern_type glob -i '*_EurchinsHg.jpg' -c:v libx264 -crf 20 EurchinsHg.mp4
# /opt/homebrew/bin/ffmpeg -i EurchinsHg.mp4 -vf "vidstabtransform=input=transforms.trf" -crf 20 EurchinsStabilized.mp4
def replace_color_with_image(background, overlay, target_color, tolerance, output_path):
"""
Replaces a specific color in an image with another image.
Args:
background_path (str): Path to the background image.
overlay_path (str): Path to the overlay image (can be the same as background if no overlay needed).
target_color (tuple): RGB color to replace (e.g., (255, 0, 0) for red).
tolerance (int): Tolerance range for color matching.
replacement_image_path (str): Path to the replacement image.
output_path (str): Path to save the output image.
"""
if background is None or overlay is None:
raise FileNotFoundError("One or more images not found.")
# Create a mask for the target color
lower_bound = np.array([max(0, c - tolerance) for c in target_color], dtype="uint8")
upper_bound = np.array([min(255, c + tolerance) for c in target_color], dtype="uint8")
mask = cv2.inRange(overlay, lower_bound, upper_bound)
kernel = np.ones((3, 3), np.uint8)
dialated_mask = cv2.dilate(mask, kernel, iterations=1)
mask_rgb = cv2.merge((dialated_mask,dialated_mask,dialated_mask))
mask_inv = cv2.bitwise_not(dialated_mask)
mask_inv_rgb = cv2.merge((mask_inv,mask_inv,mask_inv))
masked_background = cv2.bitwise_and(mask_rgb, background) # pixels from background where target_color is in the overlay.
masked_overlay = cv2.bitwise_and(mask_inv_rgb, overlay) # pixels from background where target_color is in the overlay.
combined = cv2.add(masked_background, masked_overlay)
cv2.imwrite(output_path, combined)
f = open("transforms.trf", "w")
f.write("VID.STAB 1")
f.write("# accuracy = 15")
f.write("# shakiness = 3")
f.write("# stepsize = 4")
f.write("# mincontrast = 0.200000")
f.write("Frame 1 (List 0 [])
")
img1 = cv2.imread('0012_EurchinsHg.jpg')
mask = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE)
currentMask = mask
#sift
sift = cv2.SIFT_create()
keypoints_1, descriptors_1 = sift.detectAndCompute(img1,mask)
for n in range(1,67): # Remember to +1 the end number.
print("Frame " + str(n))
img2 = cv2.imread("{:04d}_EurchinsHg.jpg".format(n))
#img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
keypoints_2, descriptors_2 = sift.detectAndCompute(img2,currentMask)
#feature matching
bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=True)
matches = bf.match(descriptors_1,descriptors_2)
matches = sorted(matches, key = lambda x:x.distance)
# Get key points
points1 = np.float32([keypoints_1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
points2 = np.float32([keypoints_2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
# Affine matrix
matrix, _ = cv2.findHomography(points2, points1, cv2.RANSAC, ransacReprojThreshold=5.0)
# Align
new_background_color = (0, 255, 0) # Green
aligned_image = cv2.warpPerspective(img2, matrix, (img1.shape[1], img1.shape[0]), borderValue=new_background_color)
replace_color_with_image(img1, aligned_image, new_background_color, 1, "aligned_{:04d}_EurchinsHg.jpg".format(n))
f.close()
The actual stabilization is done with ffmpeg:
/opt/homebrew/bin/ffmpeg -framerate 30 -pattern_type glob -i 'aligned_*_EurchinsHg.jpg' -c:v libx264 -crf 20 AlignedEurchinsHg.mp4 Species: Strongylocentrotus droebachiensis (Green Sea Urchin), Strongylocentrotus purpuratus (Purple Sea Urchin)
John Harvey Photo > Blogs for 2025 to 2005 > April 2025 > Ogden Point Urchins
|
|
|
Northern Saw Whet Owl
Saturday, April 5th, 2025 at 23:43:32 Northern Saw Whet Owl Species: Aegolius acadicus (Northern Saw-whet Owl)
John Harvey Photo > Blogs for 2025 to 2005 > March 2025 > Northern Saw Whet Owl
|
|
|
Chinatown Parade 2025
Sunday, February 9th, 2025 at 21:39:16 Chinatown Parade 2025
|
|
|
Neon In The Rain
Saturday, January 25th, 2025 at 20:00:11 Neon In The Rain John Harvey Photo > Trips out of the Country > Hong Kong 15 > Neon In The Rain
|
|
|
Snowy Owl
Sunday, January 19th, 2025 at 18:45:20 Snowy Owl Species: Bubo scandiacus (Snowy Owl)
John Harvey Photo > Blogs for 2025 to 2005 > December 2024 > Snowy Owl
|